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

langzhiwu · · 1220 次点击
这个问题使用GETSET处理的,在github已处理。感谢反馈! ![微信图片_20180628115713.png](https://static.studygolang.com/180628/d37e6f040415d69844c1ba7fad6bb71b.png)
#3
更多评论
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