幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

真正的Redis分布式锁,就该是这样实现的

  众所周知,redis分布式锁使用SET指令可以实现,但是仅仅使用该命令就行了吗?是否还需要考虑CAP理论。
  要是有上面说的那么简单就好喽,我们平时在开发中用到的分布式锁方案可能比较简单,这个取决于业务的复杂程度以及并发量。
  下面我们来说说在高并发场景中,该如何正确使用分布式锁。
  在正式讲解分布式锁之前,先来看下将要围绕展开来讲的几个问题:
  什么场景使用分布式锁?
  在同一时刻,只能有一个线程去读写一个【共享资源】,也就是高并发的场景下,通常为了保证数据的正确,需要控制同一时刻只允许一个线程访问。
  此时就需要使用分布式锁了。
  简而言之,分布式锁就是用来控制同一时刻,只有一个线程可以访问被保护的资源。分布式锁的特性无死锁:都有机会获得锁,即使获取锁的客户端挂掉;互斥:在任何的某一时刻,只有一个线程可以持有锁;
  可以使用SETNXkeyvalue命令实现互斥的特性。
  解释下:如果key不存在,则设置value给这个key,否则啥都不做。
  该命令的返回值有如下两种情况:1:表示设置成功;0:表示key没有设置成功。
  举例如下:
  成功的情况:
  SETNXlock:1011(integer)1获取101锁成功
  失败的情况:
  SETNXlock:1012(integer)0后面申请锁获取失败
  可见,成功的就可以开始使用共享资源了。
  使用结束后,要及时释放锁,给后面申请获得资源的机会。
  那么该如何释放锁呢?
  释放锁比较简单,使用DEL命令删除这个key就可以了。如下:
  DELlock:101(integer)1
  分布式锁简单使用方案如下:
  这看起来不是挺简单的吗,能有什么问题?往下听我分析。
  首先该方案存在一个锁无法被释放的问题,场景如下:服务重启了,导致无法正常释放锁;业务逻辑异常,无法执行DEL指令。
  可见,这个锁就会一直被占用,导致其它客户端也拿不到这个锁了。key设置过期时间
  优化一点:可以考虑在获取锁成功的时候给key设置一个过期时间
  设置举例如下:
  SETNXlock:1011获取锁(integer)1
  EXPIRElock:1016060s过期删除(integer)1
  可见,60秒后后该锁就好释放掉,其他客户就可以申请使用了。
  说实话,这种写法太low了,仍然存在问题。
  由上面举例可知:加锁和设置过期时间是两个操作命令,并不是原子操作。
  试想一下,可能存在这么个情况:
  比如执行第一条命了成功,第二条命令还没来得及执行就出现了异常,导致设置过期时间失败,这样锁也是无法释放。
  不要慌,Redis2。6。X之后,官方对SET命令的参数进行了扩展,即key不存在的时候设置value,同时设置过期时间,这样就可以解决以上说到的问题了,即满足了原子性。
  SETkeyNamevalueNXPX30000NX:表示当keyName不存在的时候才SET成功,从而可以成功获得锁;PX30000:表示获得的锁有设置30秒的过期时间。
  这样一看,似乎没啥毛病。不,仔细一看,写的还是不够严谨。想下,有没可能释放的不是自己加的锁。
  思考中释放的锁不是自己的
  说下什么场景下,释放的锁不是自己的:A获取锁成功并设置过期时间30秒;A由于不知什么原因执行比较慢(有可能是网络延迟问题、此时正在GC等),30秒过后还没执行完,但是锁已经过期释放了;B此时过来申请加锁成功;接着A开始执行DEL释放锁指令,这个时候就会把B的锁释放了。
  所以,有个关键点需要注意的是:只能释放自己申请的锁。
  总之,解铃还须系铃人解决释放不是自己的锁问题:
  可以在加锁的时候设置一个唯一标识作为value值。在释放锁的时候,判断获取的value值与锁的value值是否相等,相等则删除,否则不能释放锁。
  伪代码如下:
  判断value与锁的唯一标识if(redis。get(lock:101)。equals(value)){redis。del(lock:101);相等就删除}复制代码
  同样也是需要考虑原子性问题,因为这也这是GETDEL指令组合而成的。
  此时,我们可以考虑通过Lua脚本来实现,这样判断和删除的过程就是原子操作了。
  获取锁的value值与ARGV〔1〕比较,匹配成功则执行delifredis。call(get,KEYS〔1〕)ARGV〔1〕thenreturnredis。call(del,KEYS〔1〕)elsereturn0end复制代码
  使用上面的脚本,为每个锁分配一个随机字符串签名,只有当删除锁的客户端的签名与锁的value匹配的时候,才会去删除它。
  遇到问题不要慌,先从官方文档入手:redis。iotopicsdist
  到目前为止,以上修改后(优化后)的方案算相比较完善的了,业界大部分使用的也都是该方案。锁的过期时间设置多少才合适呢?
  当然这个锁的过期时间不能瞎写,通常是根据多次测试后的结果来做选择,比如压测多轮之后,平均执行时间在300ms。
  那么我们的锁过期时间就应该放大到平均执行时间的34倍。
  有些小伙伴可能会问:为啥是放大34倍呢?
  这叫凡事留一手:考虑到锁的操作逻辑中如果有网络IO操作等,线上的网络不会总是稳定的,此时需要留点时间来缓冲。
  我们可以让获得锁的线程开启一个守护线程,用来给快要过期的锁续航。
  加锁的时候设置一个过期时间,同时客户端开启一个守护线程,定时去检测这个锁的失效时间。
  如果快要过期,但是业务逻辑还没执行完成,自动对这个锁进行续期,重新设置过期时间。
  道理大家都懂,可是这样的代码该怎么写呢。
  可以先谷歌一下,相信谷歌大哥会告诉你有这么一个库把这些工作都封装好了,你只管用就是了,它叫Redisson。
  在使用分布式锁的时候,其实就是采用了自动续期的方案来避免锁过期,这个守护线程我们一般也把它叫做看门狗线程。
  记过多次优化,方案也算比较完美了,抽象出对应的模型如下。首先通过SETkeyNamerandomValueNXPXexpireTime,同时启动守护线程为快要过期但还没执行完的客户端的锁续命;然后客户端执行业务逻辑,操作共享资源;最后通过Lua脚本来释放锁,通常先get锁,判断锁是不是自己加的,然后再执行DEL操作。
  这个方案可以说很OK了,能想到这些的优化点已经击败一大批程序猿了。
  对于追求极致的程序员来说,你们可能会考虑到:在代码具体什么位置加、解锁?怎么考虑实现可重入锁?要不要考虑主从架构带来的问题?。。。。。。
  这里就不展开讨论了。有兴趣的可以在评论区一起讨论交流哈。总结到这里,分布式锁涉及的问题,以及该如何正确使用的方案都讲完了,相信你看到这里,多少会有点收获。其实,不管用什么做分布式锁都会存在的问题,重要的是自己思考的过程。此时,建议你合眼睛,自己在脑子里回顾一下,分布式锁的每一步都在做什么,为什么要这么做,解决什么问题。对于系统的设计,出发点都不一样,设计出来的方案也不尽相同,没有最好的框架,也没有最好的方案,只有最合适的。

曼城领跑总市值,粉丝代币将成为足球豪门们的下一个角力场?2019年年底,尤文图斯粉丝代币正式发行,成为全球首个面向粉丝发行代币的足球俱乐部。随后曼城、巴塞罗那、巴黎圣日耳曼、国际米兰等足球豪门相继发布各自专属的粉丝代币,更引来了意大……Hellomoto,那些年我们一起用过的摩托罗拉手机摩托罗拉,相信是无数人对手机二字最初的印象。我们很多人的第一台手机,可能就是摩托罗拉。那一声经典的美式英语Hellomoto,把我们记忆的匣子打开。今天就带大家一起……Kafka在美团数据平台的实践Kafka在美团数据平台承担着统一的数据缓存和分发的角色,随着数据量的增长,集群规模的扩大,Kafka面临的挑战也愈发严峻。本文分享了美团Kafka面临的实际挑战,以及美团针对……区块链游戏研究报告Web3。0框架下的游戏发展新方向游戏由于其虚拟属性、沉浸式的情景体验以及各种直指人心的互动玩法,天然就易聚集大批粉丝拥趸,社群基础夯实,这也造就了游戏堪称互联网时代的变现模式之首,孕育出了腾讯、暴雪、Stea……预算10001500,建议可以考虑这四款高性价比手机,大电池1、OPPOK9Pro外在:6。43英寸OLED屏幕,支持120Hz高刷,8。5mm厚度180g重量,塑料边框,塑料后盖性能:天玑1200处理器,台积电6nm工艺,……每天吃2个苹果,能有效降血脂?持续1年半的跟踪研究,给你答案每天一个苹果,医生远离我,(Anappleadaykeepsthedoctoraway)我想这句西方谚语大家应该都听过。苹果好吃,而且一年四季都是水果货架上的常客,早已经……44岁胡静近照曝光,模样大变疑似整容,脸又圆又长被嘲像冬瓜有看过古装宫廷剧《孝庄秘史》的网友,想必都知道宁静饰演的大玉儿,她聪明颖慧,在重重艰险中,稳住朝堂上下,是一位杰出的女政治家。而她身边的宫女苏茉儿,与大玉儿朝夕相处,形影不离,……B站股价一度跌8,下调一季度净营业额预期5月3日,哔哩哔哩港股一度下跌8。01,截至发稿,跌幅收窄至1。38,报200。8港元股。消息面上,5月2日晚间,哔哩哔哩股份有限公司(下称B站)发布净营业额指引更新公告……这5位明星,你以为是配角,其实是影帝影后,个个深藏不露现在的娱乐圈一提起来就是纸醉金迷,演员接戏看是不是主演,拿奖也靠粉丝投票。但也有一些明星出淤泥而不染,虽然在观众印象中都是饰演配角,但人家早就获得过影帝影后,只是低调演戏摆了。……挖槽!保罗乔治赛季报销!快船宣布重建保罗乔治自去年12月底以来因肘部韧带撕裂而一直缺阵至今。据《露天看台》的杰克费舍尔报道,保罗乔治的伤或将让他缺席本赛季剩下的所有比赛。作为快船队的领军人物,保罗乔治……韩国电影再次大丰收,我们还在自嗨中上周末,韩国人拿了英超金靴。这周末,韩国人拿了戛纳最佳导演和影帝。这是上周广泛流传于网络上的一句话。5月23日,英超末轮,热刺球员孙兴慜独中两元,以赛季23球加冕英……过年化妆好不好看,配色是关键!来看日杂女孩的示范,好自然分享新生活Hello,大家好,我是时尚八卦小天后。手头上的彩妆多了,总是想着自己搞点小创作,怎样利用一些彩色的单品来打造更好看,更别致的妆容呢?今天我们就跟着……
AIGLE新品展童装,更有好礼等你来!4月21日5月9日,法国百年品牌AIGLE春夏新品展开始,AIGLE带着无与伦比的法式时尚优雅登陆北京颐堤港,即将引领一季清新春夏。亮相本次活动的有AIGLE各种不同系列……中国家庭教育失败的根源与对策媒体经常报道90后,00后孩子离家出走,轻生自杀等事件。看到这些报道,许多人把问题归结为是现在的孩子生活条件优越,太自私,怕吃苦,只知道享乐,不懂得分享,没有家庭观念和集体荣誉……携手美女与野兽大IP,波司登玩转新套路!近日,迪士尼影业制作并出品的年度爱情巨制《美女与野兽》获得了巨大的成功,以完美的明星阵容、特效和跌宕起伏的剧情收获了过亿的票房,让迪士尼再一次成为全民瞩目的焦点。童话讴歌……今日书摘杀死一只知更鸟,关于勇气与正义的成长教科书1除非你穿上一个人的鞋子,像他一样走来走去,否则你永远无法真正了解一个人2什么是真正的勇敢不是错误地认为一个人手里拿把枪就是勇敢。勇敢就是,在你还没有开始的时……2022年前11个月我国服务进出口同比增长15。6新华社北京1月6日电(记者谢希瑶)商务部6日发布数据显示,2022年1至11月,我国服务进出口总额54046。1亿元,同比增长15。6,服务贸易继续保持增长。数据显示,2……Trollbeadsnbsp2017对话大师活动圆满落幕2017年2月4日,被誉为精灵教母的Trollbeads创始人兼设计师LiseAagaard在上海浦东嘉里城专柜举行了一场名为对话大师的搭配讲座,与粉丝们面对面交流,一同探索T……82岁的卢海鹏越老越有精神,小他5岁的弟弟卢海潮却突然离世了不久前,香港女演员戚美珍迎来了自己的61岁生日,她与丈夫苗侨伟在早前已经从加拿大返港,于是他们邀请了卢海鹏、罗兰、夏雨、林建明、黄日华、贾思乐等好友一起举办生日派对,值得一提的……katenbspspadenbspnewnbspyork圣诞圣诞节马上就要来啦,你的礼物还会远吗?今年圣诞季,katespadenewyork为你准备了几款最粉嫩的圣诞礼物,看你如何招架。贴心小物篇寒冷的冬季少不了御寒的装备……公认的五款真香手机,一部手机能正常用五年买手机不一定要选贵的,但是价格贵的手机一定有其贵的理由。这一点,我相信很多人都能理解。当然,考虑到安卓阵营里的机型比较多,不少人在换新机时显得特别迷茫。那么,接下来我给大家说说……爱情摇滚进行时nbspHardynbspHardy给你不一样HardyHardy最新系列HardyHardy最新系列灵感源自电影《黑天鹅》,电影讲述了女主角Nina揣摩到演绎黑天鹅的精髓,从而展现了充满诱惑的摄人魅力。设计师重塑黑……告别千篇一律的北京瘫,这个夏天来点个性的夏天热的让不少网友直呼热到与太阳肩并肩热到蒸发,北京瘫也就是大家最喜欢的姿势。的确,夏季这么沉闷,大家都是昏昏沉沉的,没点个性怎么能出彩?折800精选了让你这个夏天够个性的小物……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网