《redis in action》Redis锁超时和重入锁

共 638字,需浏览 2分钟

 ·

2021-04-22 22:39

之前说redis做分布式锁有个重要的问题就是事故导致锁没有被释放的问题,当时引入了锁超时的想法,意思是这个锁有一定的时间限制。超过这个时间那么锁就自动释放了。考虑到redis提供expire得特性,因此我们获取一个具有超时特性的锁的代码就变成这样。
当然这里的锁超时时间就变成了一个经验值。这是有问题的,除此之外有没有另外一种机制可以做分布式锁?答案肯定是有的。我们在学习zset的时候说zset具有排序的特性。那么我们就可以将锁保留在zset中,根据其时间进行排序,我们总是在获取锁的时候先删除超时时间之前的锁,从而保证保留于zset中的锁都是可用的。我们删除锁就是凭借其加锁的时间去做的,因为在一定时间内锁是可以保留在zset中的,因此使用zset做分布式锁具有多次获取锁的特性,这相对于之前的锁具有更大的优势。这里作者还是截一下书中python的伪代码。大概如下:
当然释放锁也是很简单,直接删除zset中的元素即可:
        那么问题是使用zset效率好还是使用expire效率好?显然是zset呀!

OK,就到这里了,下班了,听歌儿晚安吧!

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报