mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
使用双检锁优化 Token 获取 (#444)
This commit is contained in:
@@ -56,15 +56,19 @@ type ResAccessToken struct {
|
|||||||
|
|
||||||
//GetAccessToken 获取access_token,先从cache中获取,没有则从服务端获取
|
//GetAccessToken 获取access_token,先从cache中获取,没有则从服务端获取
|
||||||
func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) {
|
func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) {
|
||||||
|
// 先从cache中取
|
||||||
|
accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.appID)
|
||||||
|
if val := ak.cache.Get(accessTokenCacheKey); val != nil {
|
||||||
|
return val.(string), nil
|
||||||
|
}
|
||||||
|
|
||||||
//加上lock,是为了防止在并发获取token时,cache刚好失效,导致从微信服务器上获取到不同token
|
//加上lock,是为了防止在并发获取token时,cache刚好失效,导致从微信服务器上获取到不同token
|
||||||
ak.accessTokenLock.Lock()
|
ak.accessTokenLock.Lock()
|
||||||
defer ak.accessTokenLock.Unlock()
|
defer ak.accessTokenLock.Unlock()
|
||||||
|
|
||||||
accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.appID)
|
// 双检,防止重复从微信服务器获取
|
||||||
val := ak.cache.Get(accessTokenCacheKey)
|
if val := ak.cache.Get(accessTokenCacheKey); val != nil {
|
||||||
if val != nil {
|
return val.(string), nil
|
||||||
accessToken = val.(string)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//cache失效,从微信服务器获取
|
//cache失效,从微信服务器获取
|
||||||
|
|||||||
@@ -42,16 +42,20 @@ type ResTicket struct {
|
|||||||
|
|
||||||
//GetTicket 获取jsapi_ticket
|
//GetTicket 获取jsapi_ticket
|
||||||
func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err error) {
|
func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err error) {
|
||||||
|
//先从cache中取
|
||||||
|
jsAPITicketCacheKey := fmt.Sprintf("%s_jsapi_ticket_%s", js.cacheKeyPrefix, js.appID)
|
||||||
|
if val := js.cache.Get(jsAPITicketCacheKey); val != nil {
|
||||||
|
return val.(string), nil
|
||||||
|
}
|
||||||
|
|
||||||
js.jsAPITicketLock.Lock()
|
js.jsAPITicketLock.Lock()
|
||||||
defer js.jsAPITicketLock.Unlock()
|
defer js.jsAPITicketLock.Unlock()
|
||||||
|
|
||||||
//先从cache中取
|
// 双检,防止重复从微信服务器获取
|
||||||
jsAPITicketCacheKey := fmt.Sprintf("%s_jsapi_ticket_%s", js.cacheKeyPrefix, js.appID)
|
if val := js.cache.Get(jsAPITicketCacheKey); val != nil {
|
||||||
val := js.cache.Get(jsAPITicketCacheKey)
|
return val.(string), nil
|
||||||
if val != nil {
|
|
||||||
ticketStr = val.(string)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var ticket ResTicket
|
var ticket ResTicket
|
||||||
ticket, err = GetTicketFromServer(accessToken)
|
ticket, err = GetTicketFromServer(accessToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user