环球简讯:5分钟快速理解redis分布锁

2023-03-29 23:19:54 来源:腾讯云

目标:

我们了解分布式锁先要理解几个问题:

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.asList(getName(), getChannelName()), LockPubSub.UNLOCK_MESSAGE, internalLockLeaseTime, getLockName(threadId));

步骤解析:

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分布锁

2023-03-29

天天热讯:牛栏山母公司顺鑫农业上市25年首亏 “退房”之策能重拾“牛气”吗?

2023-03-29

每日看点!第一人称小说言情推荐_第一人称小说

2023-03-29

热资讯!陕西省二本院校排名前十_陕西省二本院校排名

2023-03-29

每日热文:粉籍是什么意思啊(粉籍是什么意思)

2023-03-29

环球讯息:粉色背景视频素材_粉色背景

2023-03-29

【全球速看料】浐灞二十一小:实践耕耘梦想 劳动砥砺真知

2023-03-29

当前热门:合力解决老小区“硬伤”!宝山这里全面开展环境清整行动

2023-03-29

天天热推荐:0功耗电子纸数字海报问世:不换画面不耗电

2023-03-29

每日看点!碧桂园服务2022年收入413.67亿元 股东应占利润同比下降51.8%

2023-03-29

当前速看:有陌生人抢孩子?北京警方通报

2023-03-29

环球速讯:以优质服务赋能企业高质量发展,龙田街道开展“引领赋能·护企暖企”话营商活动

2023-03-29

速递!防范青少年网络沉迷,父母和家庭教育是核心环节

2023-03-29

全球球精选!GitHub在南亚市场裁员超百人 印度IT业受关注

2023-03-29

当前观察:白糖潜力仍未释放完毕

2023-03-29

【聚看点】欧阳震华言论引热议,公开质问日本在內地建学校,为何不收中国人

2023-03-29

世界报道:财产分割阶段出轨怎样处理?过错还有些什么?

2023-03-29

今日讯!红豆股份(600400):3月28日北向资金减持82.74万股

2023-03-29

信息:赣州蓉江新区:“云勘验”助推数字政务提质增效

2023-03-29

全球热头条丨国家医保局:新冠治疗药价格实施分类管理,A类优先采购

2023-03-28

天天观天下!友商频繁对标Redmi!卢伟冰6个字正面回应友商竞争:你要战 那便战

2023-03-28

环球热资讯!中信建投基金:”智信物联网A“年内净值下跌11.71%,周紫光多只在管产品净值走弱

2023-03-28

【天天速看料】男子出狱不思悔改,行窃后再次被抓

2023-03-28

环球短讯!理邦仪器最新公告:2022年度净利润升0.67%至2.33亿元 拟10派2.07元

2023-03-28

当前简讯:英汉汉英实用翻译教程_关于英汉汉英实用翻译教程的简介

2023-03-28

全球聚焦:一再挑衅,港媒发现:大陆将开发比南海人工造岛更强大的挖泥船

2023-03-28

全球新动态:美国货运列车在加州脱轨 现场:铁矿石散落一地 车体严重变形

2023-03-28

世界微头条丨盛帆女篮首获全国青年(U19)联赛季军

2023-03-28

天天要闻:大连地铁回应“列车车门自动打开”:系发生机械故障无法闭合,向市民乘客诚挚道歉

2023-03-28

全球新消息丨北京推广行政执法免罚慎罚制度

2023-03-28

Copyright ©  2015-2022 东方频道网版权所有  备案号:沪ICP备2020036824号-8   联系邮箱:562 66 29@qq.com