一、RedissonFairLock#lock 源码分析
public class RedissonFairLockDemo {
public static void main(String[] args) {
RedissonClient client = RedissonClientUtil.getClient("");
RLock fairLock = client.getFairLock("myLock");
// 最常见的使用方法
try {
fairLock.lock();
}catch (Exception e){
e.printStackTrace();
}finally {
fairLock.unlock();
}
}
}
1、根据锁key计算出 slot,一个slot对应的是redis集群的一个节点
RedissonFairLock 其实是 RedissonLock 的子类,它主要是基于 RedissonLock 做的扩展,主要扩展在于加锁和释放锁的地方,其他的逻辑都直接复用 RedissonLock:例如加锁前计算slot、watchdog机制等等。
2、RedissonFairLock 之 lua 脚本加锁
RedissonFairLock#tryLockInnerAsync:里面有两段 lua 脚本,我们现在只需要关注第二段即可。
if (command == RedisCommands.EVAL_LONG) {
return evalWriteAsync(getName(), LongCodec.INSTANCE, command,
// remove stale threads
"while true do " +
"local firstThreadId2 = redis.call('lindex', KEYS[2], 0);" +
"if firstThreadId2 == false then " +
"break;" +
"end;" +
"local timeout = tonumber(redis.call('zscore', KEYS[3], firstThreadId2));" +
"if timeout <= tonumber(ARGV[4]) then " +
// remove the item from the queue and timeout set
// NOTE we do not alter any other timeout
"redis.call('zrem', KEYS[3], firstThreadId2);" +
"redis.call('lpop', KEYS[2]);" +
"else " +

本文详细分析了Redisson公平锁的实现,包括计算slot、lua脚本加锁逻辑、watchdog机制以及不同获取锁的场景。重点解释了lua脚本中的各个分支,如清理过期等待线程、检查是否能成功获取锁、处理可重入加锁、计算等待时间和首次尝试获取锁的流程。此外,还提到了watchdog如何为锁续命以及死循环获取锁的机制。
最低0.47元/天 解锁文章
5176

被折叠的 条评论
为什么被折叠?



