你是不是用redis来实现分布式锁?这些坑不得不防

前言在工作中,我们或多或少都用到过锁,今天我们就来讨论分布式场景下,我们可以通过哪种方式来解决锁的问题,这也是我在面试中经常遇到的一个问题,搞定他,非常重要。

前言

在工作中,我们或多或少都用到过锁,今天我们就来讨论分布式场景下,我们可以通过哪种方式来解决锁的问题,这也是我在面试中经常遇到的一个问题,搞定他,非常重要。

为什么需要锁

首先我们要搞懂,为什么需要锁?这是因为在同一时刻可能会有两个或两个以上的线程执行同一段代码,最经典的场景就是秒杀扣减库存,如果不对其加以控制,可能会出现期望之外的结果,比如超卖问题出现。

所以就算对并发编程没有系统学习过小伙伴,也会直接掏出万能方法-synchronized来,但是这种方式(JVM锁)只能解决单台服务器下的线程安全,如果是分布式场景下,这种方式肯定是无法满足的,这时候就需要用到分布式锁

如何实现分布式锁

实现分布式锁的方式有很多,我们常见的有数据库、redis、zookeeper,但无论哪种方式,其核心思想是共同的,就是同一时刻只能有一个线程能够获取到

比如现在有一个【下单系统】,分别在三台服务器上都部署一个实例,在同一时刻,每台服务器都想操作同一个订单的状态,但是这个时候只能有一台服务器能够操作成功,这时候就需要分布式锁的帮助了。

Redis分布式锁

redis用来做分布式锁是最常见的一种方式,之所以redis能够实现分布式锁,首先是因为它是单线程的,使用一个线程来处理所有的网络请求,因此也就不需要担心并发安全问题。

你是不是用redis来实现分布式锁?这些坑不得不防

如上图,系统A在三台服务器分别部署一台实例,如果他们在同一时候都想修改某一个订单信息,那redis是通过哪种方式来实现分布式锁呢。

熟悉redis的小伙伴都知道,redis有一个命令【SET key 随机值 NX PX 1000】:

  • NX:当key不存在的时,会设置成功。
  • PX 1000:过期时间1000毫秒,当超过该时间,会自动释放。

通过这个命令,当第一个线程设置key时,redis服务返回OK,表示获取锁成功,在超时时间内,如果有其他服务器线程通过该命令,也来尝试获取锁时,redis服务会直接返回nil,表示当前锁被其他线程占用,获取失败。

你是不是用redis来实现分布式锁?这些坑不得不防

面临的问题及解决

上述方式虽然可以满足分布式锁的需求,但是有几点问题需要我们注意:

第一点就是在设置value值时,必须使用随机值。

这是因为线程一拿到锁之后,在处理完自身业务后,会将该锁进行释放(主动删除redis中的key),但是有可能该线程阻塞了很长时间才处理完成,此时该可能已经被自动释放,并且被其他线程获取到,此时线程一直接删除key,必然会导致问题出现。

因此建议设置value为随机值,这样在删除key时通过lua脚本实现,删除前判断要删除的key的value值是否与当前线程的value值相同,只有在相同情况下才进行删除操作。

第二点就是redis单点故障。

因为如果是普通的redis单实例,那就是单点故障。或者是redis普通主从,那redis主从异步复制,如果主节点挂了,key还没同步到从节点,此时从节点切换为主节点,别人就会拿到锁。

RedLock原理介绍

该方案是redis官方支持的分布式锁算法,也是对上述方式的优化,这里花哥简单介绍一下原理。

你是不是用redis来实现分布式锁?这些坑不得不防

如上图,假设现在有5个redis节点,节点之间相互独立,彼此之间不进行同步,某个线程如果想要成功获取到锁,需要完成以下几个步骤:

  1. 获取当前时间戳,单位是毫秒;
  2. 使用相同的key和随机value,轮流尝试在每个master节点上创建锁;
  3. 当且仅当从大多数(N/2+1,这里是3个节点)的Redis节点都取到锁,并且获取锁使用的时间小于锁失效时间时,锁才算获取成功。;
  4. 客户端计算建立好锁的时间,如果建立锁的时间小于超时时间,就算建立成功了;
  5. 如果由于某些原因未能获得锁,比如无法在至少N/2+1个Redis实例获取锁或获取锁的时间超过了有效时间,客户端应该在所有的Redis实例上进行解锁。

RedLock存在的问题

  1. 如果线程1从3个实例获取到了锁,但是这3个实例中的某个实例的系统时间走得稍微快一点,则它持有的锁会提前过期被释放,当他释放后,此时又有3个实例是空闲的,则线程2也可以获取到锁,则可能出现两个线程同时持有锁了。
  2. 如果线程1从3个实例获取到了锁,但是万一其中有1台重启了,则此时又有3个实例是空闲的,则线程2也可以获取到锁,此时又出现两个线程同时持有锁了。

总结

今天和大家分享了分布式锁中redis的实现方式,介绍了它的实现原理和需要注意点,不过说实话,redis用来做分布式锁个人认为并不是很完美,一般我也不这么用。至于为什么,除了redis自身的不足外,还要和其他实现方式进行对比取舍。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/60622.html

(0)

相关推荐

  • 华为智慧屏摆脱IPTV机顶盒,用KODI免费看IPTV电视直播回看的方法

    虽然现在看电视的年轻人越来越少了,但还是有人喜欢用电视看看新闻联播、体育赛事直播、甚至最新的电视剧乃至综艺节目。但奈何广电系的独家垄断,导致如今的智能电视看个电视还需要配合广电有线机顶盒或者运营商IPTV机顶盒,广大用户往往需要手持两个遥控器来回切换,体验非常差,简直不像这个时代应该有的东西。今天就给大家介绍一下华为智慧屏(任何可以安装kodi的智能电视都可以)用KODI免费看IPTV电视直播以及回看的方法,从此彻底告别运营商的机顶盒。

    科技 2021年10月30日
  • 氨氯地平和硝苯地平,哪个降压效果更好?医生立刻解释了利弊。

    氨氯地平和硝苯地平是属于钙通道阻滞剂组的药物,主要用于控制高血压。两种药物的作用机制相同。这些药物会使血管周围的肌肉和心脏肌肉松弛。

    生活 2021年11月1日
  • 1024程序员节活动,1024程序员节的由来

    1024程序员节是广大程序员的共同节日。1024是2的十次方,二进制计数的基本计量单位之一。针对程序员经常周末加班与工作日熬夜的情况,部分互联网机构倡议每年的10月24日为1024程序员节。到今年,已经是程序员们过的第8个程序员节了。

    科技 2021年10月24日
  • 孩子入睡前五分钟脑子里在想什么?|主题列表

    我们生命中有三分之一的时间都在睡觉。睡觉看起来是理所当然的事,但实际上睡眠在每个个体身上存有差异性,这决定了尽管人类显示出一种固定的24小时的作息模式,但每个人的高峰和低谷都不相同。有的人习惯于早睡早起,有的人则变成了夜猫子。夜猫子经常受到指责,但科普作家马修·沃克在《我们为什么要睡觉》中说,这种睡觉偏好不是他们的意识缺陷,而是基因宿命,是不可避免的DNA结构,让他们生来就处于一种推迟的时间表中。

    生活 2021年12月4日
  • 国家电网和拼多多(选国家电网还是拼多多)

    知乎上有人问:本人是某top3本硕,EE专业,秋招拿到了老家不差的地级市国网(东部沿海,非江浙山东)供电局与平多多的offer。现在在纠结,应该选择哪一个。选择国网供电局的offer的话,在老家,日子可以过得比较舒适。主要是稳定性使得失业的心理焦虑比较小,未来的确定性较大。在老家,房价也比较低。在老家,可以住较大的房子,可以有更多的时间陪伴家人。不足之处是本人在国网中没有任何关系,本来国网中就讲关系,然后我老家所在城市更是如此,估计一辈子都在基层了。选择了国网也意味着放弃了大城市,我们老家城市未来的发展我是看不透的。还有一点是,国网的钱是真的少,工作也很辛苦,估计以后的钱会更少。至于稳定性,这一点其实也是有隐忧的,因为98年国企员工下岗潮让我觉得,稳定性只是大家根据国网以前的形势得来的结论,随着电改的进行,以后是否那么稳定就不一定了。以及,到了市供电局分配岗位,是随机的,就怕被分配到不好的岗位和县局。选择拼多多的话,钱倒是很多,只是在上海的话,房价高昂,可能用尽全力也买不了什么学区房,孩子只能上“菜小”,对其未来肯定不利。同时,除了买房以后,还有高昂的教育消费。在拼多多,可以说是没有个人时间,没有生活,然后对身体伤害也比较大。而且自己是自学转码,其实自己目前技术似乎也不好,如果没有个人时间自学的话,估计很难有什么提升,程序员这条路的发展怕是会后续无力。到了三四十岁,估计不得不面临被优化。只是,觉得在大城市,可以免去小城市的扰人的关系往来,也觉得自己有比较广阔的未来(想想而已,毕竟在上海是艰难求生存,不知道未来是如何),还有就是钱多。钱多还是挺有吸引力的,毕竟世界上只有一种病,那就是穷病。总结一下,在国网工作有以下优缺点:优点:(1)小城市性价比较高,我们城市的房价还算是合理的(2)确定性和稳定性较大;(3)相对来说,可以兼顾家庭和工作;以后也可以参与到孩子教育里缺点:(1)钱少;真的是穷啊;而且有进一步下降的可能(2)加班也不少(3)有一定概率发生安全事故;(4)没有关系,估计一辈子当个基层;而且工人相对不体面(是一个学姐说的)在pdd工作有以下优缺点:优点:(1)钱多;(2)接触到的牛人多,工作环境比较好;(3)在上海生活,上海生活有很多便利;缺点:(1)势必会与女友交流减少,以后对家庭有所忽视(2)上海房价高昂(不过上海房价高昂也无可厚非,优质资源就那么多,没有房价门槛,资源都不够分)(3)失业焦虑与年龄压力比较大;(4)对身体健康不太友好,长时间的加班可能会导致身体吃不消;推荐两个千赞回答:作者:大魔王链接:https://www.zhihu.com/question/423207447/answer/1715155394来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。兄弟,俺也是top3的,刚从南方电网某单位跳出来。这题俺有发言权。这俩选择都不是最优,相信我。目前我了解到的,周围学ee比较好的出路,一是去互联网大厂做服务器架设偏硬件的,一个是去做云相关的。为啥是这俩,因为这俩目前需求极大还不内卷,可以在一线城市拿高薪镀金后,回到二线城市找个不错的工作,甚至部门小主管。一个朋友是本科西交美硕,学的ee,去百度做了三年服务器架设,每年到手大概45,然后跳到了成都的大数据中心,类似的大数据中心,各地都在建设,对于此类人才需求量极大。另一个朋友是北理工学的光纤通信相关,在浪潮和深信服干了三年,现在跑到成都某央企旗下新成立的云业务子公司,到手30个,工作量很养生。另外,为啥从干了三年的电网跳出来,你可以听听我的看法。有好几个朋友关心我跳槽的原因和去向。先说说我的情况吧,我是17年入职南网超高压输电公司下面的检修中心。19年家里人出首付买了房,并不是留不下什么的。到手收入算上公积金,按年份依次是15、18、21,差不多每年涨两万多这样,直到30w专责或者班组长,大家可以算算需要多少年,隔壁的超高压广州局差不多16、19、22、25,值长上限能到40。评论里有人说南网数研院不行的,但数研院比超高压的收入会高不少,大概几w?具体的钱,因为发放模式不一样,所以说不准。离职的原因总结起来就是,在一线城市进体制混日子没必要,和家里的体制内发展差不多,反正都没发展,家里房价压力小还不用背井离乡,在一线城市就要干有前景的工作,即便没混上去要回家也是赚了几年快钱,混上去自然更好。具体说说为啥混不上去吧,同单位的数个985本硕,甚至是清华本硕,干了七八年了,丝毫不见升上去的可能性,升的上去的首先是关系户,别觉得关系户都是硬提拔,他们首先是干了出成绩的工作,至于为啥是他们干出成绩的工作,这还用说?其次是善于揣摩领导心意的干了很多年的舔狗,更多的是舔了也上不去。虽然卷是新常态,但电网的卷从学历素质而言确实是独一份。虽然轻松好混,但就如我总结的,要混为啥不回家混。所以干了三年后看明白这一点就一直在准备跳槽,但电网的坑就在于,进去之后,出来太难了,工作经历经验在外界完全用不上。想过考公务员,但一不是研究生,二不是党员,三专业受限,能考的好岗位属实有限。好在家乡重庆发展给力,在云平台大数据物联网这一块有很多新企业。刚好有个新成立的央企在拓展电力行业的物联网业务,经过好几轮面试总算回来了,岗位是偏前端做产品的。回家以后收入只低了一点,个人感觉更有发展空间了。人生的有趣之处就在于未来有希望。这是个极速变革的时代,过早进入电网这样一个与世隔绝的围城是一种遗憾。“坐观垂钓者,徒有羡鱼情。”我们都会过上不错的生活,可在那之后呢?最大的快乐莫过于自我价值的实现。作者:匿名用户链接:https://www.zhihu.com/question/423207447/answer/1656487127来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。这道题我做过,不想武断的给建议,我就跟大家说说选“错”了会发生什么吧。我跟题主大概率是校友(但是年龄大他不少),浙大电院硕士,本科中流985,但是我的求学生涯比较曲折,硕士毕业的时候已经29了。这是背景。2014年,我毕业二选一(其他offer没进决赛),上海电网和海康威视。按理说在确认能拿到上海户口的情况下,要我现在选我肯定选上海电网,承诺的起薪更高(当时我记得15w),工作强度更小,又稳定,又能落户上海,想不出来怎么会不选?要知道当年闵行的房价只有两万六。但我也不知道怎么想的,就觉得在上海肯定过的很苦,杭州更容易定居,于是就选了海康威视。其实当年我都是想象的,我连杭州的房价都不太知道,只是被上海两万六的房价吓坏了。后来的事情,包括上海杭州房价疯长,杭州变成奋斗比之都,我都完全没有预知。然后就去海康上班了,第一年连奖金税前拿了17w。后来每年都涨点,但是涨得不多,第三年税前全加起来能拿到25w。这时候还是买不起房子,杭州的房子开始疯长,但是家里不是很支持我在杭州定居,拿不出首付,只能干看着滨江的小户型从不到200w涨到400多w,彻底断了念想。在杭州难以定居之后,我本来想着回老家省会城市工作,结果半路被阿里巴巴发了个offer,就在杭州又工作了几年,但是仍然没买房子。其中的过程就不说了,反正没买上。倒是图便宜在老家省会买了个房子,贷款100多万,没想到买了就开始降价。这也算是求仁得仁吧,怕自己没地方住,慌不择路,果然成了韭菜。很快就来到了35岁,高强度的工作实在有点顶不住,业绩也不太好,再加上总有人鼓吹35岁要找后路,想来想去再也不想在杭州待了,一天也不想多待,放弃了一笔股票,灰溜溜回老家省会找了个民营企业的it部门工作。说实话,离开杭州的火车上,我哭了好几次。35了,什么也没挣着,为数不多的存款被我投资不慎亏了个底掉,除了一幢仍然在降价的房子和100万欠款,我什么也没留下。一路上都在想,为啥一直错?如果当时签了上海电网踏踏实实干,怎么也能像大学同学们那样混个专责,人生会明朗很多。就算留在杭州,如果在合适的时候买房而不是拿去投资做生意,自己已经是个完成了地域跃迁的新杭州人了。北方和南方,就是未来的东德和西德,北京就是柏林。而我,就是那个浪费了定居法兰克福的机会,灰溜溜跑回德累斯顿的可怜虫——这个想法一直都在我脑中萦绕,甚至到今天都没有消散……我说这些,不是想让大家可怜我,也不是贩卖负能量,我就是想跟大家说——我算是那种错上加错,近于不可挽回的案例了吧?快30才毕业,工作选错,房子选错,永远不合时宜。我都很怀疑,浙大尤其是浙大电院,还有没有比我愚蠢+倒霉的毕业生?但是事实证明,尽管我浪费了太多机会,后续的生活也并没有像我想象的那么悲观。在老家工作天天可以回家住,自己的房子谁管涨价降价?自己装修的好好的,短时间又不可能卖。而且跟老婆孩子不需要分开,周末还能看看两边父母,幸福感挺高的。老家也未必就是“东德”,尽管经济上有明显差距,但是文化上并非很落后,年轻人的观念其实也都差不多,不管是工作上还是生活中,都没有遇到太多不适。当然,最重要的还是工作。按理说像我这样的,兜了一大圈回老家,还进不了体制内,如果当年毕业的时候就想办法回到老家体制内,才是最正确的选择——我确实有特别多中小学同学都在当地的政府、事业单位,或者电网烟草等国企工作,现在也都是头头脑脑的,混的好的已经成了处长。但是说实话,我也没有比人家过的差太多。工作压力确实大一些,毕竟身在民营企业,总没有体制内那么惬意。但是我回老家这两年,放下了漂泊的焦虑,反而可以真正把心思放在工作上,事业发展的也挺好,现在做到了部门负责人岗位,薪水已经打平了我在杭州的最后一年,后续也不是没有上升的空间。太长远的事情不敢说,至少目前,我觉得自己生活的还挺好的。我啰嗦这么一大堆,就是想告诉题主这样比较优秀的年轻人(我姑且觉得自己还行吧,至少干活的能力还行),其实没有必要那么紧张。只要你的基本面在,哪怕真的选错了,结果也不至于太坏。我相信你们不管怎样,总比我要明智一点吧?放轻松,没有那么多“万劫不复”,与其追求全对的人生,不如让自己茁壮一点,能担得起选错了的阵痛。具体到题目中的选择,想兢兢业业一步一个脚印就回老家电网,想体验一下互联网的大江大河就去拼多多(其实我更推荐猿辅导,毕竟还没上市),万一后悔了,没人说过电网辞职就不能跳大厂,也没人说过互联网公司员工不能考公务员事业单位。就算大部分人做不到,你一个浙大/交大研究生,你怕啥?自信一点。

    科技 2021年12月18日
  • 大胆的爱|孩子应有的童年教育藏在《国王排名》。

    “童话的治愈力。”最近一部动漫打动了很多人,它就是在豆瓣创下9.9高分的《国王排名》。关于它,很多人的评价不是燃,而是“破防了家人们”——手机屏幕里密密麻麻的弹幕上,没有人一直哭,却总有人在为情节流泪,其中不乏很多成年人。到底为什么一部动漫会引发这么多人的情感共鸣?甚至它看上去根本像一本儿童绘本......答案正是童话照见了现实,而主人公的经历治愈了成年人的童年。

    生活 2021年11月17日