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
使用守护线程
每个应用抢占锁成功后开启一个守护线程,守护线程用来在应用还没执行完锁快到期时给应用“加油”(延长到期时间),应用和守护线程共生死,否则会出现死锁问题。
这一篇原本写了很长,由于使用的在线编辑器,一个不小心点了某个连接~导致文章内容丢失。。。。于是写的简略了些,记录过程。