文档章节

Redis分布式锁

dev_chao
 dev_chao
发布于 2017/04/04 16:50
字数 568
阅读 236
收藏 10

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

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

       

       

© 著作权归作者所有

共有 人打赏支持
dev_chao
粉丝 3
博文 36
码字总数 11281
作品 0
广州
Spring-data-redis + redis 分布式锁(二)

分布式锁的解决方式 基于数据库表做乐观锁,用于分布式锁。(适用于小并发) 使用memcached的add()方法,用于分布式锁。 使用memcached的cas()方法,用于分布式锁。(不常用) 使用redis的setnx...

xiaolyuh
2017/11/16
0
0
redis分布式锁

关于分布式锁的概念网上太多了,这里就不罗嗦了。对于开发者来说,最关心的应该是什么情况下使用分布式锁。 使用分布式锁,一般要满足以下几个条件: · 分布式系统(关键是分布式) · 共享资...

明舞
2015/10/16
5.7K
3
使用Redis实现分布式锁及其优化

使用Redis实现分布式锁及其优化 Mz的博客2017-11-0128 阅读 RedisJava分布式 目前实现分布式锁的方式主要有数据库、Redis和Zookeeper三种,本文主要阐述利用Redis的相关命令来实现分布式锁。...

Mz的博客
2017/11/01
0
0
分布式锁原理及常用实现

起因 前段时间,看到redis作者发布的一篇文章《Is Redlock safe?》,Redlock是redis作者基于redis设计的分布式锁的算法。文章起因是有一位分布式的专家写了一篇文章《How to do distributed...

偶尔诗文
2016/11/09
46
0
Spring-data-redis + redis 分布式锁(一)

分布式锁的解决方式 基于数据库表做乐观锁,用于分布式锁。(适用于小并发) 使用memcached的add()方法,用于分布式锁。 使用memcached的cas()方法,用于分布式锁。(不常用) 使用redis的setnx...

xiaolyuh
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
21分钟前
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
26分钟前
1
0
905. Sort Array By Parity - LeetCode

Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list,一个放偶数,一个放奇数,最...

yysue
30分钟前
1
0
h5 禁止手机自带键盘弹出

html: <div style="width: 350px;margin:50px auto;"><input type="text" id="datePicker" class="date_picker form-control" placeholder="点击选择入住日期" /></div> js: $("#date......

Delete90
47分钟前
1
0
color透明度对照表

透明度百分比 数值 100% 不透明 FF 95% F2 90% E6 85% D9 80% CC 75% BF 70% B3 65% A6 60% 99 55% 8C 50% 80 45% 73 40% 66 35% 59 30% 4D 25% 40 20% 33 15% 26 10% 1A 5% 0D 0% 完全透明 ......

_无问西东
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部