关于Redis的一个延伸问题讨论
来源:10-9 出现缓存雪崩该怎么办?如何避免?

LBruce
2021-03-30
即个人认为,用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/
我是勤一,欢迎随时找我!
212021-03-31
相似问题