分布式锁在未完成逻辑前过期怎么办?
分布式锁在未完成逻辑前过期怎么办?
回答重点
若锁在未完成逻辑前就过期,此时可能会产生数据不一致的问题。因为锁过期了,此时如果再出现一个客户端争抢锁,即可拿到锁然后同时进行业务操作,这等于锁失效了。
此时可以在逻辑执行过程中定期续期锁,确保锁在处理过程中不会过期。
扩展知识
看门狗机制
业界出了一个看门狗机制来防止这种情况的产生。
理论很简单,在抢到锁之后,后台会有一个任务,定时向 redis 进行锁的续期。比如锁的过期时间是 30s,可以每过三分之一时长(30/3)10s 后就去 redis 重新设置过期时间为 30s。
在锁被释放的时候,就移除这个定时任务。
redission
redission 是一个类库,封装了很多 redis 操作,便于我们使用。
其实现的分布式锁就引入了看门狗机制,具体原理和上面所述的一致,基于 Netty 的时间轮实现的定时任务,关于时间轮的面试题解析可查看《时间轮 》。
并且 redisson 支持可重入锁,即同一个线程可以多次获取同一个分布式锁,而不会导致死锁。实现方法如下:
- 在获取锁时,检查当前锁的唯一标识是否已经属于当前线程。
- 如果是,则增加一个重入计数器。
- 释放锁时,减少重入计数器,只有当计数器为 0 时才真正释放锁。
Comments