基于redis实现分布式锁遇到的一个坑

背景

之前旧代码中使用redis的incr来实现分布式锁。
逻辑大概是线上诸多线程去获取inrc一个key,第一个成功的则得到返回值1。其他线程如果inc这个变量则返回2,3,4,5…
成功返回的线程,然后再对这个key设值一个过期时间30秒。代码已经在线上跑了几个月了,没啥毛病。

遇到问题

这个问题是在测试环境遇到的,什么情况呢?就是没有线程可以成功获取这个key了,换句话说,就是这个key永远不等于1了。
查询了下redis,发现已经增加到几万了,用ttl看返回的是-1,也就是说,生命周期是永久了。

排查

对代码逻辑仔细排查,未发现不妥的逻辑。
后来,想了想,只有一种情况会出现这样的情况,那就是第一个成功incr key的线程,在进行incr后,在没来得及设值过期的时候,线程就挂了,可能是程序崩了,可能是被测试同学在启动工程的时候,停掉了,或者部署工程其他分支等。反正就是挂了。
所以这一点就违背了分布式锁的一个条件(无死锁)。

分布式锁需要具备哪些条件?
互斥性:在任意一个时刻,只有一个客户端持有锁。
无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。
容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁

验证想法

在redis del 掉这个key

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Think_Higher

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值