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) then
redis.call('pexpire', KEYS[1], ARGV[1]);
if (redis.call('hlen', KEYS[1]) > 1) then
local keys = redis.call('hkeys', KEYS[1]);
for n, key in ipairs(keys) do
counter = tonumber(redis.call('hget', KEYS[1], key));
if type(counter) == 'number' then
for i=counter, 1, -1 do
redis.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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Redis 8.0:开启一体化多功能开源数据平台新时代
老王两点中
147次阅读
2025-05-12 09:00:43
Redis 挂 AGPLv3 “战袍”,开源江湖风云突变
青年数据库学习互助会
80次阅读
2025-05-08 10:04:49
Redis改协议内幕曝光!核心开发者亲述被“踢出局”,外部贡献者几乎全跑光了!
老鱼笔记
51次阅读
2025-04-17 10:41:56
Redis数据库——Cluster集群模式
编程Cookbook
51次阅读
2025-04-16 15:34:44
亚马逊:MemoryDB,一款内存优先的云数据库
数据库应用创新实验室
37次阅读
2025-04-18 09:54:15
redis初识
chirpyli
35次阅读
2025-05-07 17:32:31
优雅遍历和删除特定开头的key
陌殇流苏
30次阅读
2025-04-25 12:17:03
Redis学习笔记
chirpyli
17次阅读
2025-05-13 15:40:30
Redis内存溢出故障排查
IT那活儿
14次阅读
2025-04-25 10:10:09
Redis再次开源!reids8.0.0一键安装脚本分享
小周的数据库进阶之路
13次阅读
2025-05-08 10:04:52