用Redis实现分布式锁 与 实现任务队列

langzhiwu · · 1220 次点击
或者在Unlock时可以用lua脚本将下面的判断做成原子操作: if _uuid, _ := redis.String(rlock.Redis_conn.Do("GET", redisKey)); _uuid == uuid { rlock.Redis_conn.Do("DEL", redisKey) }
#5
更多评论
buscoop
纸上得来终觉浅,绝知此事要躬行!
拍砖star
#1
//ttl小于0 表示key上没有设置生存时间(key是不会不存在的,因为前面setnx会自动创建) //如果出现这种状况,那就是进程的某个实例setnx成功后 crash 导致紧跟着的expire没有被调用 //这时可以直接设置expire并把锁纳为己用 if ttl < 0 { rlock.Redis_conn.Do("EXPIRE", redisKey, expire) rlock.LockedNames[name] = expireAt return true } 这种情况下可能会有多个进程同时执行到这个条件里面,导致这些进程都获取到了锁 if timeout <= 0 || timeoutAt < time.Now().UnixNano()/1e6 { break } time.Sleep(time.Duration(waitIntervalUs)) `time.Now().UnixNano()/1e6`的单位是ms,而timeoutAt单位是秒; `time.Duration(waitIntervalUs)`是把waitIntervalUs当纳秒用了
#2