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

cc959798
  • 34

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

回复
阅读 5.7k
7 个回答

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

jedisCluster.set(key, value, "NX", "EX", 10); // 10秒后一定会释放
yakamy
  • 2
新手上路,请多包涵

除了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过期。

高哲
  • 4
新手上路,请多包涵

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

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

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

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

susecjh
  • 1
新手上路,请多包涵

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

宣传栏