package redis_lock import ( "code.gitea.io/gitea/modules/redis/redis_client" "time" ) type DistributeLock struct { lockKey string } func NewDistributeLock(lockKey string) *DistributeLock { return &DistributeLock{lockKey: lockKey} } func (lock *DistributeLock) Lock(expireTime time.Duration) bool { isOk, _ := redis_client.Setnx(lock.lockKey, "", expireTime) return isOk } func (lock *DistributeLock) LockWithWait(expireTime time.Duration, waitTime time.Duration) bool { start := time.Now().Unix() * 1000 duration := waitTime.Milliseconds() for { isOk, _ := redis_client.Setnx(lock.lockKey, "", expireTime) if isOk { return true } if time.Now().Unix()*1000-start > duration { return false } time.Sleep(50 * time.Millisecond) } return false } func (lock *DistributeLock) UnLock() error { _, err := redis_client.Del(lock.lockKey) return err }