Redisson 源码解析--公平锁
2021-04-12 13:40:43 0 举报
登录查看完整内容
Redisson 源码解析--公平锁
作者其他创作
大纲/内容
zadd redisson_lock_timeout:{test} timeout uuid:线程2
redisson_lock_timeout:{test}
KEYS[1] = test KEYS[2] = redisson_lock_queue:{test} 基于redis的数据结构实现的一个队列 KEYS[3] = redisson_lock_timeout:{test} 基于redis的数据结构实现的一个Set数据集合,有序集合 ARGV[1] = 30000ms 存活时间 internalLockLeaseTime ARGV[2] = e6690487-9222-4a99-9074-19a432a951a9: 1 线程名称 ARGV[3] = 当前时间戳 + 5000 毫秒 ARGV[4] = 当前时间戳
否 退出循环
test 锁不存在&&( queue 为空 || queue[0] = 当前线程 )
4
线程2加上锁之后会在这里进行线程2数据的删除 第一步 第二步
false
时间计算
ttl = 从 timeout 中获取当前线程的zscore - 当前时间戳
KEYS[2]
线程3
否
ttl
从 queue:{test} 中获取第一个元素
<= 当前时间
这一步主要是在把小于当前时间的线程移除,重新插入,等他们抢锁时重新插入
从 KEYS[2] List 中弹出第一个元素
ZSet
判断test 中是否有当前线程的key
说一下这个公平锁的重排线程1 :持有锁 10:00:00线程2:入队时间:10:00:35 (4秒后加锁, 10:00:04) tti = test的锁剩余时间 26 26 + 10:00:04 + 5000 = 35 ,但是是26后执行线程3:入队时间:10:00:40 (4秒后加锁, 10:00:08) tti = 35 - 08 = 27 timeout = 27 + 10:00:08+5000ms当时间这时候来到10:00:36秒,如果线程2因为网络等原因,在35秒的时候没有尝试加锁刷新他的score的值,那这时候当有线程4进行加锁的时候,这时候就会线程2移除队列,因为他的时间已经过期,然后线程4入队,然后等线程2加锁的时候,重新入队因为queue和timeout的两个数据时-1 永不过期的,如果队列中tryLock的加锁数据,那他实际上,这个锁尝试一次就不再加了,但是还在队列中,所以这种数据就需要删除while true的用处
Lua 脚本的执行逻辑
是
线程1释放锁的时候 ,这时候会唤醒线程2 3的while循环,然后让他们去尝试加锁,但是加锁的时候,会有一个list队列头元素的判断,所以其实只要是数据在队列中,也就是有第一个元素能加到锁但是如果这时候线程4来抢锁,因为他不在队中,当她需要加锁的时候先判断 这一步,然后发现不是队头,也不是重入的线程,就会让他自己入队。
返回
线程1 释放锁
redisson_lock_queue:{test}
nil
rpush redisson_lock_queue:{test} uuid:线程2
true
线程2,走到这里的时候,就会把自身信息加入到queue和timeout中
ttl = 获取 test 的锁生存时间
线程3会走这里
第一个元素 != null && 不是当前线程
hexists
timeout ZSet中插入当前线程
rpush 插入到queue的最右边
判断这个线程是否是第一次加入,如果是已经加入过,只更新keys3的score值,queue中不会再插入
1、对当前线程id的值进行+1 {UUID:线程1 :2 }2、设置test 的有效时间为30S
1、exists 判断锁 “test” 是否存在2、exists 判断List集合queue:{test} 是否存在3、从queue:{test}钟获取第一个元素 == UUID:线程1
timeout = ttl + 当前时间+5000ms
是否存在元素
发生的可能 :线程2到时间后未刷新score值,其他线程加锁移除了线程2
1、从queue中移除元素2、从timeout中移除元素
KEYS[3]
重入
List
判断
线程1第一次过来枷锁,这里肯定是没有元素的线程2过来也没元素线程3过来的时候,这时候队列中有线程2
1、弹出 queue 的第一个元素 (移除)2、移除有序集合 timeout 中的当前线程id3、对test设置一个hash的值 {UUID:线程1 :1 }4、设置test 的有效时间为30S
while (true)
从timeout中获取线程2的score值
线程1
0 条评论
回复 删除
下一页