之前说redis做分布式锁有个重要的问题就是事故导致锁没有被释放的问题,当时引入了锁超时的想法,意思是这个锁有一定的时间限制。超过这个时间那么锁就自动释放了。考虑到redis提供expire得特性,因此我们获取一个具有超时特性的锁的代码就变成这样。

当然这里的锁超时时间就变成了一个经验值。这是有问题的,除此之外有没有另外一种机制可以做分布式锁?答案肯定是有的。我们在学习zset的时候说zset具有排序的特性。那么我们就可以将锁保留在zset中,根据其时间进行排序,我们总是在获取锁的时候先删除超时时间之前的锁,从而保证保留于zset中的锁都是可用的。我们删除锁就是凭借其加锁的时间去做的,因为在一定时间内锁是可以保留在zset中的,因此使用zset做分布式锁具有多次获取锁的特性,这相对于之前的锁具有更大的优势。这里作者还是截一下书中python的伪代码。大概如下:

当然释放锁也是很简单,直接删除zset中的元素即可:

那么问题是使用zset效率好还是使用expire效率好?显然是zset呀!
OK,就到这里了,下班了,听歌儿晚安吧!
探讨了使用Redis的ZSet实现分布式锁的方法,并对比了使用Expire的方式,提出ZSet方式的优势在于能够自动清理过期锁,确保锁的有效性。
1395

被折叠的 条评论
为什么被折叠?



