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

posted @ 2019-03-25 22:33  zlAdmin  阅读(131)  评论(0)    收藏  举报