| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- package lock
- import (
- "errors"
- "fmt"
- "github.com/zeromicro/go-zero/core/stores/redis"
- "time"
- )
- func NewRedisLock(key string, r *redis.Redis) *RedisLock {
- lock := redis.NewRedisLock(r, fmt.Sprintf("LOCK_%v", key))
- lock.SetExpire(5)
- return &RedisLock{lock}
- }
- type RedisLock struct {
- *redis.RedisLock
- }
- func (rl *RedisLock) Lock() error {
- for {
- acquire, err := rl.Acquire()
- switch {
- case err != nil:
- return err
- case acquire:
- // 获取到锁
- return nil
- case !acquire:
- time.Sleep(200 * time.Millisecond)
- }
- }
- }
- func (rl *RedisLock) UnLock() error {
- release, err := rl.Release()
- if !release {
- err = errors.New("解锁失败")
- }
- return err
- }
|