搜索文章看到的基于redis的分布式锁的实现几乎都是setnx + expire,另外还有一个就是redissen的分布式锁的实现。
setnx + expire的实现有一个比较现实的问题就是非原子的操作,由于我们采用的了codis作为redis集群方案,不支持redis的事务,redis-cluster应该也不支持事务。所以无法做到通过事务来实现两个操作的原子性。当时可以通过其他的手段来实现,比如setnx的值可以添加时间戳,通过时间戳比较来实现等等,操作比较麻烦。
今天看到京东到家的技术分享 ,文中提到了一种原子方案,后续我们可以考虑用这种方案来实现。
redis 2.6.12版本以后,对set之类的命令进行了功能扩容。
从上图可以看出ttl变成-2以后,又可以加锁了。
网友评论