Redisson源码
2022-04-06 15:40:18 0 举报
Redisson分布式锁基本流程
作者其他创作
大纲/内容
MasterSlaveEntry
返回null
否
进入
evalAsync()
是否释放成功
是
RedissonBaseLock
异步线程lua释放锁evalWriteAsync(...)
是否延时成功
是否默认过期时间
lua脚本\
entry.connectionWriteOp(command)
是否默认的过期时间
lua加锁是否成功
线程等待等待锁释放的消息
是否有异常
批次执行器executor = new RedisBatchExecutor<>()
CommandAsyncService
开启异步延长过期时间renewExpirationAsync(threadId)
unlock()
添加执行参数addBatchCommandData(params);
result = executorService.evalWriteAsync()
用CF(CompletableFuture)进行事件编排mainPromise = createPromise();
future=evalWriteAsync(...)
voidPromise = new CompletableFuture<>();
RedisExecutor
EXPIRATION_RENEWAL_MAP中是否存在当前线程
writeConnectionPool.get(command);
链接完成,前面编排的一系列事件就依次触发执行
future.whenComplete(
MasterConnectionPool
异步获取锁evalWriteAsync()
过期entry是否为空
获取锁的异步执行
把voidPromise封装进去executor = new RedisCommonBatchExecutor(
对promisevoidPromise进行任务编排
进入lamda
最后异步完成脚本执行
取消定时延长任务cancelExpirationRenewal(threadId);
跳出
RedissonLock
entry.getCommands().add(commandData);
promise = new RedissonPromise<>();
进入循环
MasterSlaveConnectionManager
lua脚本延长\
executor.execute();
async()
获取线程Id
抛异常,没得锁
封装参数args = new ArrayList
进入tryAcquire
看门狗定时延长过期时间scheduleExpirationRenewal(threadId);
future = executorService.executeAsync();
进入回调
executor.execute();return new CompletableFutureWrapper<>(mainPromise);
结束
订阅锁频道future = subscribe(threadId);
释放锁
抛异常
是否获取到锁
跳出循环
lua脚本加锁\
触发cf执行promise.complete(conn)
是否还没获取到锁
lock()
获取锁的异步futurettlRemainingFuture.thenApply()
阶段处理future.handle(...)
CommandBatchService
unlockAsync(threadId)
取消锁频道订阅
cf结果result = new CompletableFuture<T>();
创建定时任务commandExecutor.getConnectionManager().newTimeout()
future = unlockInnerAsync(threadId);
进入thenApplylamda表达式
进入创建task
返回锁的过期时间
得到锁释放的消息后信号量卡线程
connectionFuture = getConnection().toCompletableFuture();
取消延时任务 cancelExpirationRenewal(null);
新建entry并开启定时任务renewExpiration();
ConnectionPool
返回
打印异常并删除任务entryEXPIRATION_RENEWAL_MAP.remove(...)
嵌套迭代renewExpiration();
获取锁
0 条评论
下一页