redisson的锁的类型_Redis 锁续期的那些事

1、Redis 锁的使用

作为非常流行的 NoSQL 数据库,Redis 已成为后端开发非常熟悉的中间件,除了常被用来做缓存外,还经常被用做分布式锁。

它的语法如下:

setNx key value

Set key to hold string value if key does not exist. In that case, it is equal to SET. When key already holds a value, no operation is performed. SETNX is short for "SET if Not eXists".

setNx 命令是 set if not exists 的缩写,在指定的 key 不存在时,为 key 设置指定的值。

设置成功则命令返回 1,设置失败则返回 0。

2、Redis 分布式锁常见问题

是否用了 Redis 作为分布式锁就万事大吉了呢?当然不是,如果用不好可能还有一堆坑等着跳。

例如使用上述的命令加锁,如果加锁成功,在业务执行过程中宕机了,锁就无法被释放,其它线程永远得不到执行逻辑的机会。

key 加上过期时间就可以解决这个问题,但是在加锁和设置过期时间的间隔发生宕机,同样会出现锁无法释放的场景。

在 2.6.12 版本,Redis 可以通过如下命令实现原子性的加锁并且设置过期时间。

SET key value NX PX 10000

PX milliseconds -- Set the specified expire time, in milliseconds. 

NX -- Only set the key if it does not already exist.

即便使用原子命令加锁并设置过期时间,还有其他场景问题需要解决。

问题场景:

设置锁过期时间为 N 秒,A 线程拿到锁,业务执行时间超过 N 秒时,锁过期被释放,B 线程拿到锁,A 线程执行完毕释放掉锁,C 线程又拿到锁

这里有两个问题,一是加锁与释放锁混乱,二是未执行完毕逻辑锁被过期释放

  • 解决加锁与释放混乱,可以采用将 value 设置为随机数的方式,A 线程设置的锁,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值