Browse Source

update redis lock

tags/v1.22.5.2^2
chenyifan01 3 years ago
parent
commit
a624735f82
2 changed files with 14 additions and 13 deletions
  1. +5
    -5
      modules/auth/wechat/access_token.go
  2. +9
    -8
      modules/redis/redis_lock/lock.go

+ 5
- 5
modules/auth/wechat/access_token.go View File

@@ -9,7 +9,7 @@ import (

const EMPTY_REDIS_VAL = "Nil"

var accessTokenLock = redis_lock.NewDistributeLock()
var accessTokenLock = redis_lock.NewDistributeLock(redis_key.AccessTokenLockKey())

func GetWechatAccessToken() string {
token, _ := redis_client.Get(redis_key.WechatAccessTokenKey())
@@ -28,15 +28,15 @@ func GetWechatAccessToken() string {
}

func refreshAccessToken() {
if ok := accessTokenLock.Lock(redis_key.AccessTokenLockKey(), 3*time.Second); ok {
defer accessTokenLock.UnLock(redis_key.AccessTokenLockKey())
if ok := accessTokenLock.Lock(3 * time.Second); ok {
defer accessTokenLock.UnLock()
callAccessTokenAndUpdateCache()
}
}

func refreshAndGetAccessToken() string {
if ok := accessTokenLock.LockWithWait(redis_key.AccessTokenLockKey(), 3*time.Second, 3*time.Second); ok {
defer accessTokenLock.UnLock(redis_key.AccessTokenLockKey())
if ok := accessTokenLock.LockWithWait(3*time.Second, 3*time.Second); ok {
defer accessTokenLock.UnLock()
token, _ := redis_client.Get(redis_key.WechatAccessTokenKey())
if token != "" {
if token == EMPTY_REDIS_VAL {


+ 9
- 8
modules/redis/redis_lock/lock.go View File

@@ -6,22 +6,23 @@ import (
)

type DistributeLock struct {
lockKey string
}

func NewDistributeLock() *DistributeLock {
return &DistributeLock{}
func NewDistributeLock(lockKey string) *DistributeLock {
return &DistributeLock{lockKey: lockKey}
}

func (lock *DistributeLock) Lock(lockKey string, expireTime time.Duration) bool {
isOk, _ := redis_client.Setnx(lockKey, "", expireTime)
func (lock *DistributeLock) Lock(expireTime time.Duration) bool {
isOk, _ := redis_client.Setnx(lock.lockKey, "", expireTime)
return isOk
}

func (lock *DistributeLock) LockWithWait(lockKey string, expireTime time.Duration, waitTime time.Duration) bool {
func (lock *DistributeLock) LockWithWait(expireTime time.Duration, waitTime time.Duration) bool {
start := time.Now().Unix() * 1000
duration := waitTime.Milliseconds()
for {
isOk, _ := redis_client.Setnx(lockKey, "", expireTime)
isOk, _ := redis_client.Setnx(lock.lockKey, "", expireTime)
if isOk {
return true
}
@@ -34,7 +35,7 @@ func (lock *DistributeLock) LockWithWait(lockKey string, expireTime time.Duratio
return false
}

func (lock *DistributeLock) UnLock(lockKey string) error {
_, err := redis_client.Del(lockKey)
func (lock *DistributeLock) UnLock() error {
_, err := redis_client.Del(lock.lockKey)
return err
}

Loading…
Cancel
Save