Redis分布式锁
博客专区 > dev_chao 的博客 > 博客详情
Redis分布式锁
dev_chao 发表于1年前
Redis分布式锁
  • 发表于 1年前
  • 阅读 208
  • 收藏 10
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

       分布式锁的应用场景有很多:比如多台机器都可以定时执行某个任务,但是任务每次只能被一台机器执行;又比如多个分布式任务要给某用户推送消息,要求一段时间内只能推送一条。

       实现分布式锁有好几种方式,如数据库、缓存、Zookeeper,本文讲述如何使用Redis实现分布式锁。

       使用Redis实现分布式锁,有两个重要函数需要介绍:

       1.setnx(set if not exist):当且仅当key不存在,将key的值设为value,并返回1;若给定的key已经存在,则不做任何动作,并返回0。

       2.getset(get and set):将给定key的值设为value,并返回key的旧值;当key不存在时,返回nil。

===============================================================

       要对key:goods100加锁,具体实现:

       1.执行 setnx goods100 <current_time + timeout>;

       2.如果返回1,表示任务成功获得锁,处理完成后,执行 del goods100 释放锁;

       3.如果返回0,表示已经有任务占用了锁,我们可以轮询来获取锁;

       这就完了吗?No,生产环境比开发环境复杂的多,出现问题的概率也高,如果获得了锁的任务执行异常导致锁没有释放,你不是大家都在干等?终于轮到getset出场了。

        任务A轮询了好一会儿,等不及了:

        1.执行 get goods100,结果记为T1,与当前时间作比较,如果小于当前时间,则可认为锁超时;

        2.执行 getset goods100 <current_time + timeout>,结果记为T2,如果T1=T2,则任务A获得锁;

        3.如果T1!=T2,说明有一个像任务A一样的家伙抢走了锁,任务A继续轮询,而由任务A导致的键值变化可忽略不计;

===============================================================

注:

       1.获取 current_time 时,多台机器应该保证时间的一致,也可以读取第三方如redis的时间;

       2.释放锁时,最好可以判断一下锁的持有者还是不是自身;

       3.轮询时,时间间隔要控制好,是否在业务、Redis的可承受范围内;

代码:https://github.com/devchao/redisLock,如若有错,自备板砖~。

参考资料:http://blog.csdn.net/ugg/article/details/41894947

       

       

标签: Redis分布式锁
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 33
码字总数 11147
×
dev_chao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: