Redis篇—redis分布式锁实现原理

93 阅读2分钟

问题一:

Redis分布式锁如何实现?

答:在redis中提供了一个命令setnx.redis是单线程的,使用这个命令之后,只能有一个客户端对某个key设置值,在没有过期或删除key的时候,其他客户端是不能设置这个key的。

问题二:

如何控制Redis实现分布式锁有效时长?

答:这个可以采用redis中的一个框架redisson实现。

在redisson中需要手动加锁,并且可以控制锁的失效时间和等待时间,当锁住的业务还没有执行完的时候,在redisson中引入看门狗机制,就是说每隔一段时间就检查当前业务是否还持有锁,如果持有锁就增加锁的持有时间,当业务执行完成之后需要使用释放锁。

在高并发的情况下,一个业务可能会执行很快,先客户1持有锁的时候,客户2来了以后不会马上拒绝,它会自选不断尝试获取锁,如果客户1释放锁之后,客户2就可以马上持有锁,性能也得到提升。

问题三:

redisson实现的分布式锁是可重入的吗?

答:可以重入,可以避免死锁。这个重入其实在内部就是判断是否是当前线程持有的锁,如果是当前线程持有的锁就会计数,如果释放锁就会在计算上减一。

问题四:

redisson实现的分布式锁能解决主从一致性问题吗?

答:不能。

比如,当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次加锁,会在新的master节点上加锁成功,这个时候就会出现两个节点同时持有一把锁的问题。

可以使用redisson提供的红锁来解决,但是性能太低。