本文最后更新于55 天前,其中的信息可能已经过时。
Redission 分布式锁
总体流程
Step1:尝试获取锁,这一步是通过执行加锁Lua脚本来做; Step2:若第一步未获取到锁,则去订阅解锁消息,当获取锁到剩余过期时间后,调用信号量方法阻塞住,直到被唤醒或等待超时 Step3:一旦持有锁的线程释放了锁,就会广播解锁消息。于是,第二步中的解锁消息的监听器会释放信号量,获取锁被阻塞的那些线程就会被唤醒,并重新尝试获取锁。
怎么控制 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了,即不能误解锁。
各线程争抢锁操作对应到redisson中就是争抢着去创建一个hash结构,谁先创建就代表谁获得锁;hash的名称为锁名,hash里面内容仅包含一条键值对,键为redisson客户端唯一标识+持有锁线程id ,这样解锁的时候也需要 这个唯一标识才能解锁,所以就不会解掉其他客户端的锁了。
有一台服务器加锁成功了,服务没有执行完成,但是服务器宕机了,那么这个锁会不会释放,什么时候释放
在加锁的同时就设定好了过期时间,如果没设置在lua脚本中也能看到默认时间是30000毫秒,就算服务器宕机了,锁最终也会释放
一般使用时都会, try catch finally,finally代码中要释放资源,这样就算执行的代码有异常也能立即释放锁
要是服务实例1没有宕机但是业务执行还没有结束,锁释放掉了就会导致线程问题
实现自动延长锁有效期的机制,有一个定时任务去异步监听,在锁key还没有失效的情况下,会把锁的过期时间继续延长到30000毫秒,也就是说只要这台服务实例没有挂掉,并且没有主动释放锁,看门狗都会每隔十秒给你续约一下,保证锁一直在你手中。