文档章节

Redis分布式锁

dev_chao
 dev_chao
发布于 2017/04/04 16:50
字数 568
阅读 223
收藏 10
点赞 0
评论 0

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

       实现分布式锁有好几种方式,如数据库、缓存、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
每日一博 | 基于 redis 的 spring boot 分布式锁实现

每日一博 | 基于 redis 的 spring boot 分布式锁实现 Harries Blog™2018-01-030 阅读 ACESpringAppbeanAPIbuildAOPActionbug 随着现在 分布式 架构越来越盛行,在很多场景下需要使用到 分布...

Harries Blog™
01/03
0
0
并发编程-锁的发展和主流分布式锁比较总结

一、锁的发展 系统结构由传统的“单应用服务--》SOA --》微服务 --》无服务器” 的演进过程中,场景越来越复杂,由单体应用的但进程中多线程并发的内存锁,随着互联网场景越来越复杂,在复杂...

贾浩v
2017/10/24
0
0
基于Redis实现简单的分布式锁

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

Float_Luuu
2016/05/18
1K
0
关于redis分布式锁的初步研究与分享

导言: 前段时间项目中用到了分布式锁,所以就对分布式锁进行了一些研究,首先当然是去看redis的分布式锁实现,这里说明一下,分布式锁的实现可以有两种比较简单的方式来实现,一种是redis的...

zhangkay
2017/12/16
0
0
jedisLock—redis分布式锁实现

搬运工:http://www.cnblogs.com/0201zcr/p/5942748.html jedisLock—redis分布式锁实现 一、使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以使用Reentrant...

北极之北
2017/01/06
849
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

rabbitmq学习记录(三)

工作队列:一个生产者,多个消费者,生产者直接将消息发送到rabbitmq的队列之中 默认采用的是轮询分配:即不管消费者处理信息的效率,队列给所有消费者轮流发送一条信息,直至消息发送完毕 ...

人觉非常君
20分钟前
0
0
Java 之 反射

反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。 测试类代码如下: class Person { private String name; public St...

绝世武神
24分钟前
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
29分钟前
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
32分钟前
0
0
003. es6数值的扩展

一、普通扩展 Number 方法,将字符串、数值转为十进制 : Number('0b111') Number.isFinite() 用来检查一个数值是否为有限的:Number.isFinite(15) Number.isNan() 用来检查一个值是否为NaN N...

秋季长青
46分钟前
0
0
C语言数组和指针的语法糖

对于C语言,我可以这样秀:比如当创建一个数组arr[n]之后,一般我们去遍历数组的时候是for (int i = 0; i < n; i++) { a[i]; }但是我知道下表访问符[]是个语法糖,也就是说a[i]在编译器看来是...

ustbgaofan
54分钟前
0
0
Call to undefined function bcmath()的解决方法

乐意黎的ECS主机环境,Centos7.2 + PHP7 由于使用了bcdiv()函数,运行时总在抛错。 Fatal error: Call to undefined function bcmath() in /usr/loca/apache/htdocs/... on line 4 一查得知:......

dragon_tech
今天
0
0
css优先级

..

architect刘源源
今天
0
0
【转】Twitter的分布式自增ID算法snowflake

结构 snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以...

talen
今天
0
0
hive支持行级修改

Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。 一、Hive具有ACID语义事务的使用场景 1. 流式...

hblt-j
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部