比如setnx 操作,如果设置成功了,但是程序中断del失败了,这个锁就不会永远不释放了吗?设置过期时间也是有可能失败的,毕竟这是两步操作
除了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过期。
setnx,并不是很适合做分布式锁,因为无法设置过期时间,会存在你说的释放问题。
通常的做法是,set(加上过期时间)+ lua保证原子性,redisson这个redis库已经实现了。
对于不过期的锁,在节点宕机后也不用担心死锁。redisson内部有一个监控,其他节点会定时检测未释放的锁。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
set的ex nx参数 了解一下,版本不支持那就自己写一个原子操作