关于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回答

张勤一

2021-03-31

同学你好:

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


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

2
1
LBruce
明白了,Redis无法正确实现分布式锁!在用在对锁要求严格的场景下不可用
2021-03-31
共1条回复

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

452 学习 · 204 问题

查看课程