redis如何实现分布式锁

redis实现分布式锁

最近面试,被问到分布式锁,在网上看到程序员小灰的漫画解读后觉得理解了一些,再次记录一下文字过程。

1. 版本1

加锁:setNX()

设置超时时间:expire()

解锁:del(key)

问题所在:加锁和设置超时时间不是原子操作,有线程不安全的风险。

2. 版本2

加锁+设置超时时间:set(key,1,expireTIme,NX)

解决了线程还未来得及设置超时时间就挂掉,锁变得“长生不老”的问题。

问题所在:不支持可重入,有并发风险,有误删其他线程锁的风险

3. 版本3

加锁+设置超时时间+设置value为线程Id:set(key,ThreadId,expireTime,NX)

解决了可重入和误删风险。
问题所在:判断锁和解锁不是原子操作,还是有并发风险。

4. 版本4

使用lua脚本,可以组合多个命令,将判断和解决变为原子操作

5. 版本5

使用守护线程

每个应用抢占锁成功后开启一个守护线程,守护线程用来在应用还没执行完锁快到期时给应用“加油”(延长到期时间),应用和守护线程共生死,否则会出现死锁问题。

这一篇原本写了很长,由于使用的在线编辑器,一个不小心点了某个连接~导致文章内容丢失。。。。于是写的简略了些,记录过程。

什么是分布式