文档章节

Redis分布式锁

dev_chao
 dev_chao
发布于 2017/04/04 16:50
字数 568
阅读 264
收藏 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

       

       

© 著作权归作者所有

共有 人打赏支持
上一篇: Spring循环依赖
下一篇: SQL优化建议
dev_chao
粉丝 3
博文 36
码字总数 11158
作品 0
广州
私信 提问
一文弄懂“分布式锁”,一直以来你的选择依据正确吗?

我们本文主要会关注的问题是“分布式锁”的问题。 多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。 常见的分布式...

向南
12/04
0
0
基于Redis实现简单的分布式锁

摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问。分...

Float_Luuu
2016/05/18
1K
0
Spring-data-redis + redis 分布式锁(二)

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

xiaolyuh
2017/11/16
0
0
Spring-data-redis + redis 分布式锁(一)

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

xiaolyuh
2017/11/15
0
0
如何在springcloud分布式系统中实现分布式锁?

转载请标明出处: http://blog.csdn.net/forezp/article/details/68957681 本文出自方志朋的博客 最近在看分布式锁的资料,看了 Josial L的《Redis in Action》的分布式锁的章节。实现思路是...

forezp
2017/04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Js中DOM事件绑定分析

在这篇文章中小编给大家整理了关于JS中DOM事件绑定的相关知识点,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 #Js事件绑定 Ja...

前端攻城小牛
6分钟前
1
0
指令、伪操作、伪指令和宏指令区别

汇编语言程序中的语句可以由指令、伪指令和宏指令组成。 指令:每一条指令都对应一种CPU操作。 伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择...

二营长意大利炮
7分钟前
0
0
SQL Server SQL语句删除索引

当删除索引提示超时时候,可以使用SQL语句删除索引,可以避免删除索引超时问题。 use [数据库名]drop index [索引名称] on [表名]

产吅经理
7分钟前
0
0
深入解析Axios 常用的请求方法别名

下面小编就为大家分享一篇Axios 常用的请求方法别名,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 #Axios 是一个基于 promise ...

前端攻城老湿
13分钟前
0
0
深入解析Vue开发动态刷新Echarts组件的教程

需求背景:dashboard作为目前企业中后台产品的“门面”,如何更加实时、高效、炫酷的对统计数据进行展示,是值得前端开发工程师和UI设计师共同思考的一个问题。今天就从0开始,封装一个动态渲...

peakedness丶
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部