Redis setNX锁实现

本文探讨了Redis中使用setNX实现锁的并发控制策略,包括为锁设置过期时间避免死锁,使用Lua脚本确保释放锁操作的原子性,每个客户端携带唯一随机值以保证锁的唯一性,以及利用getset命令检查锁是否超时,防止多个客户端同时获取锁。此外,还介绍了Redis处理过期键的三种策略:定时删除、惰性删除和定期删除。

setNX设置锁时 设置值和过期时间是个原子的操作。

对于setNX的并发性问题在底层实现上有这些措施。

1.对锁加一个过期时间,防止客户端A设置了锁,然后客户端挂了,锁一直得不到释放这种情况。

2.释放锁的操作必须使用Lua脚本来实现。释放锁其实包含三步操作:'GET'、判断和'DEL',用Lua脚本来实现能保证这三步的原子性。否则,如果把这三步操作放到客户端逻辑中去执行的话,就有可能发生这种问题:

  1. 客户端1获取锁成功。

  2. 客户端1访问共享资源。

  3. 客户端1为了释放锁,先执行'GET'操作获取随机字符串的值。

  4. 客户端1判断随机字符串的值,与预期的值相等。

  5. 客户端1由于某个原因阻塞住了很长时间。

  6. 过期时间到了,锁自动释放了。

  7. 客户端2获取到了对应同一个资源的锁。

  8. 客户端1从阻塞中恢复过来,执行DEL操纵,释放掉了客户端2持有的锁。

 

3.设置锁的时候每个客户端会带上一个随机值。

     

  SET resource_name my_random_value NX PX 30000

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值