redisson分布式锁文章回顾
NO.1

回顾

{"anyLock": {"mode": "read","uuid01:threadId01": 3}}{anyLock}:uuid01:threadId01:rwlock_timeout:1 1{anyLock}:uuid01:threadId01:rwlock_timeout:2 1{anyLock}:uuid01:threadId01:rwlock_timeout:3 1
NO.2

问题

NO.3

读锁的watchDog原理

我们知道在加锁成功了之后,会开启一个watchDog,来定时的进行锁的续约,核心方法是在renewExpirationAsync()方法中,在里面定义了如下续约的lua脚本
local counter = redis.call('hget', KEYS[1], ARGV[2]);if (counter ~= false) thenredis.call('pexpire', KEYS[1], ARGV[1]);if (redis.call('hlen', KEYS[1]) > 1) thenlocal keys = redis.call('hkeys', KEYS[1]);for n, key in ipairs(keys) docounter = tonumber(redis.call('hget', KEYS[1], key));if type(counter) == 'number' thenfor i=counter, 1, -1 doredis.call('pexpire', KEYS[2] .. ':' .. key .. ':rwlock_timeout:' .. i, ARGV[1]);end;end;end;end;return 1;end;return 0;
说明:
keys[1] : anyLock 就是我们声明的锁名字
argv[1] : 30000ms
argv[2] : 客户端唯一标识 => uuid01:threadId01
watchDog续约的核心逻辑:
执行hget anylock uuid01:threadId01的value值,获取加锁的次数,判断是否持有锁,如果没有直接返回
如果持有锁,执行pexpire anyLock 30000重置过期时间
判断锁的属性个数是否大于1,我们知道读锁加锁成功之后,会有mode和客户端标识属性
获取锁的所有属性值,循环遍历所有的属性值,找到非mode以外的属性
获取当前客户端加锁的次数,我们知道一个客户端重复的加锁,在redis中会记录下面类似的数据,来记录客户端锁的过期时间
{anyLock}:uuid01:threadId01:rwlock_timeout:1 1{anyLock}:uuid01:threadId01:rwlock_timeout:2 1{anyLock}:uuid01:threadId01:rwlock_timeout:3 1所以watchDog在进行续约的时候,需要重置上面数据的超时时间,
上面lua脚本最内层的for循环就是重置上面数据的超时时间
NO.3

总结


点个在看你最好看
文章转载自程序猿西蒙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




