Redis分布式锁

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

       实现分布式锁有好几种方式,如数据库、缓存、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

       

       

转载于:https://my.oschina.net/lizhenchao/blog/873010

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值