一、RedissonLock#lock 源码分析
1、根据锁key计算出 slot,一个slot对应的是redis集群的一个节点
redisson 支持分布式锁的功能,基本都是基于 lua 脚本来完成的,因为分布式锁肯定是具有比较复杂的判断逻辑,而lua脚本可以保证复杂判断和复杂操作的原子性。
redisson 的 RedissonLock 执行lua脚本,需要先找到当前锁key需要存放到哪个slot,即在集群中哪个节点进行操作,后续不同客户端或不同线程再使用这个锁key进行上锁,也需要到对应的节点的slot中进行加锁操作。
执行lua脚本的源码:
org.redisson.command.CommandAsyncService#evalWriteAsync(java.lang.String, org.redisson.client.codec.Codec, org.redisson.client.protocol.RedisCommand<T>, java.lang.String, java.util.List<java.lang.Object>, java.lang.Object...)
@Override
public <T, R> RFuture<R> evalWriteAsync(String key, Codec codec, RedisCommand<T> evalCommandType, String script, List<Object> keys, Object... params) {
// 根据锁key找到对应的redis节点
NodeSource source = getNodeSource(key);
return evalAsync(source, false, codec, evalCommandType, script, keys, params);
}
private NodeSource getNodeSource(String key) {
// 计算锁key对应的slot
int slot = connectionManager.calcSlot(key);
return new NodeSource(slot);
}
计算 slot 分主从模式和集群模式,我们一般生产环境都是使用集群模式。

public static final int
Redisson分布式锁原理与lua脚本解析

本文解析了RedissonLock的加锁过程,包括如何通过slot定位到集群节点、lua脚本实现加锁逻辑,以及watchdog机制确保锁的生存周期。重点讲解了lua脚本、加锁流程、死锁防范和多种加锁方式的应用。
最低0.47元/天 解锁文章
805





