Redis分布式锁实现理解,redis分布式锁实现原理
分布式锁的需求产生分布式锁的需求是伴随着应用分布式部署而来的,在单体应用,且只部署一台服务器的情况下,通过java的同步锁即可实现。首先明确分布式锁应该具备什么特性:获取锁的业务无论正常与否,都必须能释放锁,这样才能避免死锁;锁应该具有高可用性。
如何实现靠谱的分布式锁?
谢邀~我不写具体的代码,就花几分钟介绍一下什么是分布式锁,以及实现方案。为什么需要分布式锁在单个应用中,如果多个线程需要同时对一个数据进行修改,那么Java可以使用并发处理相关的API来保证,同一个时间,这个数据只能被一个线程修改,例如synchronized。但是在分布式的环境当中,经常会有多个应用要同时修改同一个数据,如果不做互斥的话,很容易造成“未知的异常”。
比如商城,商品剩余量只有一件,如果碰巧两个应用同时要扣除商品数量,如果不做互斥的话,那么会出现明明商品数量不足,但是依然下单成功的情况。分布式锁应该具备哪些条件同一时间只能被一个机器的一个线程执行;高性能的获得锁和释放锁;具有失效机制,防止死锁;又分阻塞锁和非阻塞锁,前者没有获得锁就等着,后者没有获得锁会直接返回失败。
实现方式基于ZooKeeper:ZooKeeper是一个为分布式应用提供一致性服务的开源组件。大概的思路就是利用临时节点与 watch 机制。每个锁占用一个普通节点/lock,当需要获取锁时在/lock目录下创建一个临时节点,创建成功则表示获取锁成功,失败则 watch/lock 节点,有删除操作后再去争锁。
基于Redis:基于 redis 的 setnx()、get()、getset()方法做分布式锁。基于数据库:在数据库中创建个表,字段创建唯一索引,想要获取锁,就向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、职业发展等方面的见解,希望能得到你的关注;另外,关注我后私信【资料】两个字,可获取架构、大数据、面试等相关资料。
如何优雅地用Redis实现分布式锁?
首先明确分布式锁应该具备什么特性:获取锁的业务无论正常与否,都必须能释放锁,这样才能避免死锁;锁应该具有高可用性。我们来看看redis是怎么来实现锁的的。redis主要是通过setnx、get、getset、del命令来完成加锁,抢锁和释放锁的操作的,这里我用两个客户端来模拟下加锁的过程。下面有实际操作的截图。
1、客户端1使用setnx获取到锁,并设置锁的当前时间。设置超时时间就是为了业务挂了,锁不能释放成为死锁。执行命令setnx lock 0为了方便举例,我们假定锁的当前时间是从0秒开始的,超时时间为3秒。如果结果返回为1,表明加锁成功,可以执行业务逻辑了。2、当第一秒钟客户端2使用setnx获取锁,执行命令setnx lock 1返回值为0,则加锁失败。
3、客户端2接收到加锁时间的回应后,会去查看锁是否超时。执行命令get lock返回值为加锁的时间,假设现在时间已经到第4秒了,客户端会使用返回的时间0加上超时时间3小于当前时间4,锁已经超时了。4、客户端2使用getset命令去获取锁。getset lock 4这时候返回的是前一次加锁的时间,如果这个时间是0,证明加锁成功,因为和前一次get的值相同。
如果不同,说明锁已经被别人抢占了,加锁失败,继续重复步骤3和4。5、业务执行完成后,判断下锁是否超时,没有超时,不用管了。如果没有超时,调用del命令释放锁即可。redis存在的问题1、redis如果是单机的话是有单点问题的,不满足高可用性。redis集群因为是ap模型,是不能保证一致性的,官方提供了redlock算法来解决这个问题,但是至少需要3个master-slave节点才能完成,成本也较大。
Redis分布式锁的原理是什么?如何续期?
分布式锁的需求产生分布式锁的需求是伴随着应用分布式部署而来的,在单体应用,且只部署一台服务器的情况下,通过java的同步锁即可实现。同步锁,即是一个原子性的操作。那么当应用进行了分布式部署,应用有多个服务,这个时候应用服务端就没有一个可提供原子性操作的地方了,Redis性能高,且是单线程,因此可提供一个原子性操作的地方,利用它,就可以实现分布式锁。
用场景说话,使用Redis分布式锁的场景如下图所示:如下图所示,随后会根据场景说明分布式锁及续期相关问题的来龙去脉。图中序号1:进来一个请求,这个请求要求我们保存一个“订单A”;图中序号2:2.1 步,请求进来,首先去尝试设置一个Redis 值,他的键就是订单号“订单A”,如果尝试成功,则代表我这个线程是第一次设置,相当于我拿到了这个锁;如果尝试失败,那么,可以抛出异常或者等待一段时候后再次重试,这里可以根据业务场景的不同采取不同的策略。
这里的关键是在Redis中的操作是单线程的,因此该操作是原子性的。2.2步,为了防止应用服务意外中断,Redis中的数据一直存活,消耗资源,需要设置一个超时时间。(如果为了严谨,可以将2.1, 2.2 两步封装成一个lua脚本部署在Redis服务器上)图中序号3:情况A,这个时候是当Redis的key还未失效,程序就已经执行完成,且删除了Redis中的数据,一切正常;情况B:就是需要续期的场景,如果要避免这个场景的出现,可以将Redis key的失效时间设置长一点,可以应对大多数业务。
Java语言如何正确实现Redis分布式锁?
和大家分享我的经验,如何用redis提供的一个简单接口,轻松实现redis分布式锁。在开始之前,我先简单介绍下redis的性能。高效的RedisRedis本身是单线程的,这样带来的好处是能够提高读写效率。多线程通常来说会有上下文切换带来的时间损耗,而redis通过绑定单个CPU到某块内存,实现了上下文切换的最小开销,因此这种场景反而比多线程还要高效。
不安全的Redis但是,如果有不同的节点同时要对Redis中的同一个数据进行操作,由于是来自不同Redis服务器,就会发生线程不安全的情况。举例有两个功能函数X和Y(也可以看做是两个服务器节点),二者功能相同,都要执行读取Redis中变量P,并且对其加一的操作。如果是线程安全的,那么X和Y分别执行完之后,P的值应该比原来增加2,但是由于函数XY互相独立,那就可能发生下面这种情况:1 X读取P2 Y读取P3 X将P 1写回Redis4 Y将P 1写回Redis执行结束后,P的值却变成了P 1,而不是P 2。
这就是线程不安全导致的结果。redis的分布式锁那么如何用Redis来避免上面的情况呢。Redis对外开放了一个非常厉害的api,目前经常被大家用来做分布式锁,是绝对的线程安全,这个函数就是SET key field value加上NX参数。这个NX参数可是了不得,通常来说,set函数是不管field字段是否存在,只要写入成功就会返回1,但是如果增加了NX参数,那么如果field值在redis中已经存在,就会返回nil,否则才返回1。
因此可以通过这个函数来执行加锁操作,如果返回值不为nil,则加锁成功,否则代表有其他线程在操作数据,当前请求需要等待。不仅如此,为了避免死锁,SET还有一个参数为EX,即EX毫秒后,field会自动清空。此外,还有PX,XX参数,具体含义见如下文档。以上就是我在工作中总结的防止redis并发的方式,如果你有其他想法,欢迎在下方评论区与我沟通。
本文地址:http://vmwizqzk.55jiaoyu.com/show-737522.html
本文由合作方发布,不代表展全思梦立场,转载联系作者并注明出处:展全思梦
推荐文档
- 11.往年大连中考满分是多少
- 12.为什么说学播音毁一生,原因有哪些
- 13.淘宝店铺的优质好评语大全
- 14.考研可改变第一学历吗、专科考研可以改变第一学历吗
- 15.民学网查出的学历国家承认吗(民学网查出的学历国家承认吗是真的吗)
- 16.往年轻薄商务笔记本电脑推荐-商务轻薄本性价比排行
- 17.承德护理职业学院(承德护理职业学院2023年招生计划)
- 18.wreak是什么意思wreak的翻译(wake,area是什么意思中文翻译)
- 19.电子科技大学A+类学科名单有哪些(含A、B、C类学科名单)
- 20.systematic是什么意思systematic的翻译(systematically是什么意思中文翻译)
- 21.leant是什么意思leant的翻译(lean,on什么意思中文意思)
- 22.华南农业大学是几本大学,华南农业大学是一本还是二本
- 23.包头中考考试科目时间预测安排,包头中考考哪几门考哪些课程
- 24.高考430分能上什么大学,430分高考能报啥学校
- 25.朱自清的散文代表作有什么(朱自清的散文代表作有什么散文集有什么散文诗集有什么)
- 26.浙江有几所大学是985和211,全国985和211大学名单汇总
- 27.i5,1155G7和R5,5600U哪款好-对比评测
- 28.荷兰什么叫-荷兰弟为什么叫荷兰弟,出演蜘蛛侠原因曝光
- 29.警察警衔工资改革新政策及新方案【全文】解读
- 30.电大专科(电大专科毕业论文)
- 31.广东省高级技工学校官网
- 32.广州大学专科
- 33.大连陆军学院,原大连陆军学院校址现在什么是什么学校
- 34.亲们,谁给一份南京大学的研究生招生简章?(河海大学
- 35.他日若遂凌云志全诗及出处
- 36.铜绿的化学式是什么有哪些性质
- 37.「佛山市顺德养正西山学校初中部」往年录取分数线
- 38.公办本科(公办本科和民办本科有什么区别)
- 39.外交学院是名牌大学吗
- 40.往年湖南高考成绩排名一分一段表
- 41.全国有8所烟草院校是哪些(这4所大学门槛低)
- 42.私人垄断资本主义基本概念是私人垄断资本主义
- 43.难以启齿,这8部影片可以一看(性教育适合看的影片)
- 44.美国独立战争的性质爆发战争的原因是什么
- 45.往年东莞市高中排名前十最新
- 46.大朗网络教育(大朗教育)
- 47.往年甘肃省高中排名最好的高中
- 48.逻辑思维训练有哪些方法优秀训练方法推荐
- 49.浙江大学教务管理系统
- 50.人类的动物老师有哪些这属于什么学科
- 51.往年山西高考状元榜_山西历届高考理科状元和文科状元
- 52.往年北京舞蹈学院艺术类招生简章招生人数及专业
- 53.航空最好的5个专业就业前景如何
- 54.太原科技大学怎么样及评价好不好太原科技大学口碑如何
- 55.满招损谦受益这句话的意思是什么出自哪
- 56.舍本逐末发生在什么时期含义是什么
- 57.女孩子首选十大专业什么专业适合女生
- 58.国防生是什么意思指的是什么
- 59.河南省三本学院有哪些2018最新三本院校名单
- 60.往年龙岩高中学校排名榜单龙岩十大优秀高中
- 51.日语人才网,厦门日企招聘
- 52.苏泊尔电磁炉间歇性加热,苏泊尔电磁炉发生间歇性加热故障,如何处理呀?
- 53.JOJO立Dio篇,dio立
- 54.骁龙625,4GB,6.44寸屏,小米max2上市价格
- 55.武汉卷烟厂怎么进,往年武汉卷烟厂招收应届生岗位要求
- 56.移动硬盘都是叠瓦盘吗,西数移动硬盘叠瓦盘一览
- 57.坚果手机系统更新,应用商店,游戏中心都不能使用了
- 58.新桥镇供电局电话是多少,台州市路桥区新桥镇停电
- 59.没文化学什么技术赚钱,学什么技术挣两三万一月
- 60.夏天防晒衣穿什么颜色好,皮肤衣选择什么颜色好看
- 61.二油三水是指什么,认识五油三水很重要
- 62.沈阳移动还有什么活动,中国移动的老用户
- 63.临洮金祺百合房价多少,洮阳镇党建,小区治理破解难题改民生
- 64.柳江县里高镇土地项目是什么,又一巨头项目进驻柳江区
- 65.吉林省招标网是多少,国家电投四平一热
- 66.螺州新城在哪里,螺洲新城三期·简
- 67.金乡县金东小学在哪里,光南小学正式由金外托管
- 68.陕蒙界属于什么分公司,高交大队陕蒙中队执法大直播
- 69.海丰市民广场在哪里,寮步市民广场在哪里
- 70.哈尔滨油工辅料哪里购,装修公司问我清工辅料

