请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于Redis的一个延伸问题讨论

即个人认为,用Redis无法用来实现严格意义上的分布式锁。

Redis实现分布式锁的原理:

setnx,当某个key不存在的时候,设置上某个key,在短期间内,能成功执行此操作的请求只有1个,相当于拿到了一把锁。业务逻辑执行完成之后,再把这个key删除,或者是设置上expireTime,避免因为服务器宕机,导致锁永远不释放。

可能出现问题的场景

线程1在执行lock的时候,redis服务端已经执行成功,但是因为网络原因,响应还没有返回给客户端,过了expireTime时间以后,响应终于回来了,对于线程1来说,它是拿到了分布式锁的,但是此时的锁已经是失效的了!如果此时又来个线程2申请加锁,显然也能获取锁,因为线程1的锁已经失效了,此时就会有2个线程同时获取锁。

不管怎么想,貌似都没法解决这种问题。因此得出结论是如果对锁严格程度要求不高的话,可以使用Redis做分布式锁。如果对锁的要求非常严格,可能还是要用zookeeper。(好像zookeeper诞生就是为了解决分布式锁的问题的)。
一哥有什么见解?谢谢一哥

正在回答

1回答

同学你好:

    你这里所说的 Redis 分布式锁原理的实现其实是有缺陷的,这样的实现做不到分布式锁。我给你推荐一篇文章,可以看下,你就明白了。https://xiaomi-info.github.io/2019/12/17/redis-distributed-lock/


    我是勤一,欢迎随时找我!

2 回复 有任何疑惑可以回复我~
  • 提问者 LBruce #1
    明白了,Redis无法正确实现分布式锁!在用在对锁要求严格的场景下不可用
    回复 有任何疑惑可以回复我~ 2021-03-31 14:02:05

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信