redis实现分布式锁思路

   redis 处理socket ready 事件是单线程执行的, 也就是说redis一次只会处理一个socket, 避免了并发所带来的资源竞争问题, 可以用来实现分布式锁.
    具体实现思路: 通过SETNX尝试设值(currentTimestamp + timeout), 如果设置成功, 说明类似获取锁操作成功, 失败则获锁失败. 获锁成功的线程在处理完业务之后要手动释放锁DEL key. 由于各种不稳定因素的存在会导致获锁客户端无法释放锁, 会造成死锁, 比如服务宕机, 网络延迟等原因. 因此在SETNX失败后, 需要GET获取val既currentTimestamp + timeout 判断当前时间是否大于该值, 大于说明此锁已无效, 要么DEL, 要么重新set, DEL的话存在问题,如果直接DEL key, 再SETNX, 在并发情况下会导致SETNX成功后被后一个线程DEL, 因此建议使用GETSET, 通过比较返回值和GET 获取的旧值比较, 相同则说明获取成功, 失败则说明已被其他线程获取成功.
    由于处理业务时间可能较长, 导致锁被认为invalid, 因此需要在处理过程中检测currentTimestamp + timeout, 重新设置此值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值