1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-02-10 15:52:26 +08:00

使用双检锁优化 Token 获取 (#444)

This commit is contained in:
2021-08-26 10:34:24 +08:00
committed by GitHub
parent c61154105b
commit 80d91d8316
2 changed files with 19 additions and 11 deletions

View File

@@ -56,15 +56,19 @@ type ResAccessToken struct {
//GetAccessToken 获取access_token,先从cache中获取没有则从服务端获取
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
ak.accessTokenLock.Lock()
defer ak.accessTokenLock.Unlock()
accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.appID)
val := ak.cache.Get(accessTokenCacheKey)
if val != nil {
accessToken = val.(string)
return
// 双检,防止重复从微信服务器获取
if val := ak.cache.Get(accessTokenCacheKey); val != nil {
return val.(string), nil
}
//cache失效从微信服务器获取