目标:
我们了解分布式锁先要理解几个问题:
1.任何时候只有一个线程持有锁
2.要防止一个线程长期持有锁甚至是死锁的情况
(资料图片仅供参考)
3.加锁和解锁必须是同一个进程
4.锁延续
Redis分布式锁:
常见的分布式锁有redis分布式锁,zookeeper分布式锁,本文将为大家阐述redis分布式锁。
首先,redis分布式锁的本质就是在redis占一个坑位,利用的setnx命令,然后处理完其余的业务后再del。再setnx后如果有其它的线程进来再setnx那么是set不进去的。这就是占坑的原理。
此时第一个问题就出现了:在del之前 我的业务如果出现了错误,那么就不会去执行del,就会出现死锁的情况。
这种情况的解决方案很简单 我们只需要增加一个超时时间即可。比如设置超时时间10s锁将会自动释放。在redis2.8之后 setnx和expire是原子操作 我们不用考虑setnx后因为各种问题没有expire的情况。
那么现在就会有第二个问题:锁超时问题。
Redisson分布式锁这边我们使用redisson的分布式锁来解决这个问题。
先看一段lua脚本:
if (redis.call("exists", KEYS[1]) == 0) then " + "redis.call("hincrby", KEYS[1], ARGV[2], 1); " + "redis.call("pexpire", KEYS[1], ARGV[1]); " + "return nil; " + "end; " +
和大家解释一下这一段lua脚本的意思:
exsist 先判断有没有这个key,来看锁是否存在。
存在的话用hincrby设置一个hsah结构,然后再pexpire设置过期时间
我们再看一下redisson的一个加锁解锁流程图:
我们可以看到redisson使用了 watchdog来做锁延迟操作。
在我们redisson.trylock的时候有一个参数是releasedTime,这个参数的含义就是释放锁的时间。我们这个参数如果传了,那么看门狗就会不生效,没传的话看门狗生效,这一点很重要。
redisson 看门狗会默认10s执行一次,如果没有锁释放,那么自动锁延续。
大家看这张图可以看到,redisson还采用了redis的消息订阅与发布,如果一个线程设置了waitTime,他就会去在这个时间里去等待,订阅了一个channel,当占锁线程一旦释放了锁,占锁线程就回去发布一条消息,等待的线程订阅到了 就可以去重试再占锁。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0EVK9Y0-1678841063259)(redis分布式锁流程.png)]
流程分析:
1.客户端1尝试获取锁,返回null则加锁成功,如果有设置释放时间则直接通过lua脚本去操作redis,如果没有设置则开启看门狗机制。当没有设置释放时间,默认释放时间为30s,看门狗机制会10s进行一次所延续。
2.当客户端2获取锁失败,则通过redis的channel订阅锁释放的时间。当超过最大等待时间,则锁失效。如果等待到了锁释放时间的通知,则开始重新进入循环开始重试加锁。
3.循环中每次都先试着获取锁,并得到已存在锁的剩余时间。如果拿到了锁,直接返回。如果锁还存在,那么等待释放锁的消息,这里采用了信号量来阻塞线程,当锁释放并发布释放锁的消息后,信号量的release方法被调用,此时被信号量阻塞的队列中的第一个线程就可以继续尝试获取锁了。
我们再看一下释放锁的代码
// 判断锁 key 是否存在 "if (redis.call("hexists", KEYS[1], ARGV[3]) == 0) then " + "return nil;" + "end; " + // 将该客户端对应的锁的 hash 结构的 value 值递减为 0 后再进行删除 // 然后再向通道名为 redisson_lock__channel publish 一条 UNLOCK_MESSAGE 信息 "local counter = redis.call("hincrby", KEYS[1], ARGV[3], -1); " + "if (counter > 0) then " + "redis.call("pexpire", KEYS[1], ARGV[2]); " + "return 0; " + "else " + "redis.call("del", KEYS[1]); " + "redis.call("publish", KEYS[2], ARGV[1]); " + "return 1; "+ "end; " + "return nil;",Arrays.
步骤解析:
1.判断是否存在,如果存在的话先把可重入的值递减为0,再进行删除
2.广播锁释放消息,通知阻塞等待的进程(向通道名为redisson_lock__channelpublish 一条 UNLOCK_MESSAGE 信息)。
3.取消看门狗机制,即将RedissonLock.EXPIRATION_RENEWAL_MAP里面的线程 id 删除,并且 cancel 掉 Netty 的那个定时任务线程。
总结
Redisson的优点:1.通过watchdog解决了 锁延续问题
2.和zookeeper比较,性能更高。
3.支持可重入锁
4.在等待申请锁资源的进程等待申请锁的实现上做了优化,减少了无效的锁申请,提高了资源的利用率
缺点:1.在redis分布式锁的情况下,Master redis 加锁,然后把key同步给slave,此时master宕机,那么slave变成了master,这就会出现问题,产生脏数据。 这里用连锁的方式可以解决这个问题。
关键词:
-
焦点关注:5分钟快速理解redis分布锁
常见的分布式锁有redis分布式锁,zookeeper分布式锁,本文将为大家阐述redis分布式锁。
-
当前速读:OBS Studio 29.1 Beta 1发布:为YouTube直播添加AV1 / HEVC支持
3月29日消息,开源免费录屏和直播软件OBSStudio29 1首个维护版本更新于今天开启公测,主要通过实时消息传递协议(RTMP)实现AV1
-
从女生到“女神”,沁阳永威学校这堂生理健康课真精彩|实时
校园里除了他还有她她们她们都有一个共同的名字——青春期女孩今天下午沁阳市永威学校的教室里只有男生在上课记者正纳闷呢突然从餐厅四楼的大
-
逐梦火焰蓝 再踏新征程|临汾支队召开干部荣调欢送座谈会
逐梦火焰蓝再踏新征程|临汾支队召开干部荣调欢送座谈会
-
观焦点:郭广昌交还控制权第一年,金徽酒高管“业绩对赌”失败为何免罚?
郭广昌交还控制权第一年,金徽酒高管“业绩对赌”失败为何免罚?,股权,郭广昌,金徽酒,复星系,上市公司,公司股份
-
汉维科技 :2022年归母净利同比增长8.87%
汉维科技(836957)发布了2022年年度业绩快报,公司2022年公司实现营业收入4 88亿元,同比下降7 2%;归母净利3586 7万元,同比增长8 87
-
注射类固醇的脉冲射频可缓解坐骨神经痛-今日热讯
研究人员发现,微创手术与硬膜外类固醇注射治疗相结合,可在一年多的时间里显着减轻坐骨神经痛患者的疼痛并改善残疾。研究结果发
-
数读科创板IPO|澎立生物:生物医药临床前研究CRO服务专精特新“小巨人” 红杉、高瓴是股东
《科创板日报》3月28日讯澎立生物科创板IPO申请日前已获受理。澎立生物是国内最早聚焦于创新药研发临床前药效学研究评价的CRO公司之一,在创新
-
环球快资讯丨海南护士资格证什么时候打印准考证2023
海南护士资格证什么时候打印准考证2023由卫生 护士考试栏目提供,查找更多考试报名资讯、准考证打印、成绩查询或海南护士资格证什么时候打印准
-
中国银行大额存单多久发行一次?中国银行大额存单大额存单存款期限是多久?-今头条
中国银行大额存单多久发行一次?中国银行大额存单大额存单存款期限是 ">
-
全球微头条丨如何在网上写小说出书_如何在网上写小说
1、首先在起点注册个盛大账号,玩盛大游戏的账号就行然后在起点网,作者专区建个作者笔名,就可以在起点发表了,本人首推荐
-
靳东又要迷倒大龄女性了!新剧穿西装重回《伪装者》,大哥更帅了
在而曝光的剧照中,也可以看出靳东的很多穿搭造型和在《伪装者》里还是有很大的不同,这次他的造型会更接地气一些,虽然也有西装大衣的穿搭,
-
刚需必看!价格倒挂买到即赚!难怪42家房企拼命抢地 上周京楼市场十分活跃
京楼无非那点事儿,咱们来看看上周的京楼市场,之所以想跟大家聊聊这个话题,是因为上周的京楼市场是真热闹,开年后的第二次土拍虽然地块不多
-
我国首次实现基于碳化硅中硅空位色心的高压原位磁探测 微资讯
记者3月28日从中国科学技术大学获悉,该校郭光灿院士团队李传锋、许金时、王俊峰等人与中科院合肥物质科学研究院固体所高压团队刘晓迪研究员等
-
国家智慧教育读书平台正式上线
本报北京3月28日电 (记者吴月)记者28日从教育部获悉:国家智慧教育读书平台于当日正式上线。该平台依托数字技术,通过汇聚优质资源、营造
-
特朗普:新政府将在1月20日就职 具体什么情况【图】_天天速讯
今天来回顾关于特朗普:新政府将在1月20日就职具体什么情况【图】的文章,希望对各位小伙伴们有所帮助。【特朗普:新政府将
-
口腔溃烂吃什么食物会好的_口腔溃烂吃什么药好
1、口腔溃疡是口腔溃疡的典型症状。2、口腔溃疡的临床治疗通常是局部药物作用的症状。3、一般治疗口腔溃疡需要口服甘草锌颗粒
-
refuse的名词英语_refuse的名词 当前快报
1、形容词是refuse,表示废弃的意思,例如:2、Icouldn tverywellrefusetohel
-
上海第一代社保卡必须更换吗 世界资讯
2018年,上海启动新版社会保障卡的集中换发工作,新版的社保卡除了原有的身份凭证、信息记录、自助查询、就医结算、缴费和待遇领取等社会保障
-
最强特种保镖免费_最强特种保镖
1、保镖是保护主人不受到伤害,,。2、而特种兵是国家的利剑,你说谁厉害。本文就讲到这里,希望大家会喜欢。