Redis的分布式锁实现
什么是分布式锁?
分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。 举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁就是保证这个房子只有一个门并且一次只有一个人可以进,而且门只有一把钥匙。然后许多人要去看书,可以,排队,第一个人拿着钥匙把门打开进屋看书并且把门锁上,然后第二个人没有钥匙,那就等着,等第一个出来,然后你在拿着钥匙进去,然后就是以此类推;
Redis中的锁实现:
加锁的时候:这里有一个nx和一个ex,nx表示该key值是否存在,存在是添加不成功,EX是过期时间,超过长时间释放锁;
释放锁的时候:将传过来的value值与数据库中的实际值进行比较,如果一致,可以释放锁,即是删除这个key对value这个键值对,删除成功释放成功;
可能出现的问题:有可能两个key的value的值相等,可能存在锁释放的问题;
使用lua脚本实现分布式锁
-- 内置了一个redis的队形,其中call方法是调用reids的相关命令 -- 内置了KEYS和ARGV两个数据,用来演示传递参数 if redis.call('get',KEYS[1] == ARGV[1] then return redis.call('del',KEYS[1]) ) else return 0 end
即这样就不会出现时间窗口;
通过Redisson第三方实现:
官方文档地址:ps://github.com/redisson/redisson/wiki/Table-of-Content
我们曾如此渴望生命的波澜,到后来才发现,人生最曼妙的风景是内心的淡定与从容