redis 实现加锁怎么确保锁一定会释放?

发布于 2022-09-11 22:03:59 字数 76 浏览 36 评论 0

比如setnx 操作,如果设置成功了,但是程序中断del失败了,这个锁就不会永远不释放了吗?设置过期时间也是有可能失败的,毕竟这是两步操作

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

丘比特射中我 2022-09-18 22:03:59

set的ex nx参数 了解一下,版本不支持那就自己写一个原子操作

离鸿 2022-09-18 22:03:59
jedisCluster.set(key, value, "NX", "EX", 10); // 10秒后一定会释放
二手情话 2022-09-18 22:03:59

除了2.6.12 版本之后的 set nx ex指令,你可以setnx的时候设置value为当前时间戳,
获取锁失败后,查询value值,跟当前时间比较,如果已经超过过期时间,可以手动释放锁。

皇甫轩 2022-09-18 22:03:59

使用redis的Set操作,支持原子的。具体参考:http://redisdoc.com/string/set.html;

set name 'xiaohong' EX 10 NX: 只有当name不存在时才设置值,设置之后10s过期
set name 'xiaohong' EX 10 XX: 只有当name存在时才设置值,设置之后10s过期。

要走就滚别墨迹 2022-09-18 22:03:59

Redis的setNx(key,value),key是你要存的值,value是过期时间,这是一步操作,不用担心会失败,所以setNx也被用来做分布式锁

心安伴我暖 2022-09-18 22:03:59

setnx,并不是很适合做分布式锁,因为无法设置过期时间,会存在你说的释放问题。

通常的做法是,set(加上过期时间)+ lua保证原子性,redisson这个redis库已经实现了。
对于不过期的锁,在节点宕机后也不用担心死锁。redisson内部有一个监控,其他节点会定时检测未释放的锁。

https://github.com/redisson/r...

南巷近海 2022-09-18 22:03:59

setnx哪里不能设置过期时间了,楼上在乱吹什么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文