业务后台的分布式锁核心代码如下:
【问题分析】
1.在正常情况下,该段代码逻辑没用问题
2.但在网络发生抖动的情况下,可能导致用户首次上锁成功,再次上锁失败:
a.调用tryLock
b.运行 Long number =redis.incr(lockKey) 成功
c.网络抖动
d.运行redis.expire() 抛出网络异常,锁永远不会失效;unLock()将无法解锁,tryLock()也将失败。
3.该问题发生的概率比较小,但小概率事件必然发生(墨菲定律)。
【问题解决】
1.问题的根本原因是tryLock中的redis两个操作不是一个原子操作 ,
故解决的思路是将两个操作封装成原子操作。代码如下