即个人认为,用Redis无法用来实现严格意义上的分布式锁。
Redis实现分布式锁的原理:
setnx,当某个key不存在的时候,设置上某个key,在短期间内,能成功执行此操作的请求只有1个,相当于拿到了一把锁。业务逻辑执行完成之后,再把这个key删除,或者是设置上expireTime,避免因为服务器宕机,导致锁永远不释放。
可能出现问题的场景
线程1在执行lock的时候,redis服务端已经执行成功,但是因为网络原因,响应还没有返回给客户端,过了expireTime时间以后,响应终于回来了,对于线程1来说,它是拿到了分布式锁的,但是此时的锁已经是失效的了!如果此时又来个线程2申请加锁,显然也能获取锁,因为线程1的锁已经失效了,此时就会有2个线程同时获取锁。
不管怎么想,貌似都没法解决这种问题。因此得出结论是如果对锁严格程度要求不高的话,可以使用Redis做分布式锁。如果对锁的要求非常严格,可能还是要用zookeeper。(好像zookeeper诞生就是为了解决分布式锁的问题的)。
一哥有什么见解?谢谢一哥