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