问题一:
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提供的红锁来解决,但是性能太低。