redis 实现加锁怎么确保锁一定会释放?
比如setnx 操作,如果设置成功了,但是程序中断del失败了,这个锁就不会永远不释放了吗?设置过期时间也是有可能失败的,毕竟这是两步操作
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
比如setnx 操作,如果设置成功了,但是程序中断del失败了,这个锁就不会永远不释放了吗?设置过期时间也是有可能失败的,毕竟这是两步操作
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
set的ex nx参数 了解一下,版本不支持那就自己写一个原子操作
除了2.6.12 版本之后的 set nx ex指令,你可以setnx的时候设置value为当前时间戳,
获取锁失败后,查询value值,跟当前时间比较,如果已经超过过期时间,可以手动释放锁。
使用redis的Set操作,支持原子的。具体参考:http://redisdoc.com/string/set.html;
set name 'xiaohong' EX 10 NX: 只有当name不存在时才设置值,设置之后10s过期
set name 'xiaohong' EX 10 XX: 只有当name存在时才设置值,设置之后10s过期。
Redis的setNx(key,value),key是你要存的值,value是过期时间,这是一步操作,不用担心会失败,所以setNx也被用来做分布式锁
setnx,并不是很适合做分布式锁,因为无法设置过期时间,会存在你说的释放问题。
通常的做法是,set(加上过期时间)+ lua保证原子性,redisson这个redis库已经实现了。
对于不过期的锁,在节点宕机后也不用担心死锁。redisson内部有一个监控,其他节点会定时检测未释放的锁。
https://github.com/redisson/r...
setnx哪里不能设置过期时间了,楼上在乱吹什么?