Redission分布式锁
本文最后更新于55 天前,其中的信息可能已经过时。
Redission 分布式锁

Redission 分布式锁

总体流程

Step1:尝试获取锁,这一步是通过执行加锁Lua脚本来做; Step2:若第一步未获取到锁,则去订阅解锁消息,当获取锁到剩余过期时间后,调用信号量方法阻塞住,直到被唤醒或等待超时 Step3:一旦持有锁的线程释放了锁,就会广播解锁消息。于是,第二步中的解锁消息的监听器会释放信号量,获取锁被阻塞的那些线程就会被唤醒,并重新尝试获取锁。

  • 怎么控制 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了,即不能误解锁。

    各线程争抢锁操作对应到redisson中就是争抢着去创建一个hash结构,谁先创建就代表谁获得锁;hash的名称为锁名,hash里面内容仅包含一条键值对,键为redisson客户端唯一标识+持有锁线程id ,这样解锁的时候也需要 这个唯一标识才能解锁,所以就不会解掉其他客户端的锁了。

  • 有一台服务器加锁成功了,服务没有执行完成,但是服务器宕机了,那么这个锁会不会释放,什么时候释放

    在加锁的同时就设定好了过期时间,如果没设置在lua脚本中也能看到默认时间是30000毫秒,就算服务器宕机了,锁最终也会释放

    一般使用时都会, try catch finally,finally代码中要释放资源,这样就算执行的代码有异常也能立即释放锁

  • 要是服务实例1没有宕机但是业务执行还没有结束,锁释放掉了就会导致线程问题

    实现自动延长锁有效期的机制,有一个定时任务去异步监听,在锁key还没有失效的情况下,会把锁的过期时间继续延长到30000毫秒,也就是说只要这台服务实例没有挂掉,并且没有主动释放锁,看门狗都会每隔十秒给你续约一下,保证锁一直在你手中。

 

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇