Redis分布式锁中的问题

3 篇文章 0 订阅
2 篇文章 0 订阅

使用

使用set key value ex 5 nx命令设置key value 5秒过期 不存在才能设置成功,成功代表获取了分布式锁

随机值

在set时,key为固定,但value对不同线程应不同,如使用线程名。

如果使用的value相同会有什么问题?我们假设固定为key=lock_key,value=lock_value

假设线程1获取到了分布式锁,超时30秒,但线程1的实际执行实际达到了40秒,在第30秒的时候锁被自动释放,线程2拿到了锁,线程2在继续自己的任务,假设是30秒。十秒后线程1结束,释放了锁,但这时候释放的是线程2设置的锁,从而导致同步出错。

若每个线程对应的value是不同的,在释放锁时只有value相同才会释放。但这个判断删除操作不是原子性的,可以使用lua脚本方式实现

if redis.call('get', KEYS[1]) == ARGV[1] 
then return redis.call('del', KEYS[1]) 
else return 0 end

锁超时

如上面所说的,如果获取锁设置了30秒超时,但实际任务执行时间超过了30秒怎么办?
可以使用守护线程的方式,在第29秒时给key续命10秒,然后十秒后守护线程继续执行。
主线程执行结束守护线程也会跟随销毁

单机故障引发并发问题

对于主从同步的情况,在主节点拿到了锁,但这个锁没有同步给从节点的时候主节点挂了,从节点上位,从而其他线程也能拿到锁,导致两个客户端拿到了锁。这种情况如果业务不能容忍可以考虑官方提供的RedLock

参考

https://blog.csdn.net/u010325193/article/details/87887030
https://www.cnblogs.com/gxyandwmm/p/9588383.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值