当前位置: 首页 > news >正文

Redisson源码剖析-可重试机制的实现

    private <T> RFuture<Long> tryAcquireAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) {if (leaseTime != -1) {return tryLockInnerAsync(waitTime, leaseTime, unit, threadId, RedisCommands.EVAL_LONG);}RFuture<Long> ttlRemainingFuture = tryLockInnerAsync(waitTime,commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(),TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG);ttlRemainingFuture.onComplete((ttlRemaining, e) -> {if (e != null) {return;}// lock acquiredif (ttlRemaining == null) {scheduleExpirationRenewal(threadId);}});return ttlRemainingFuture;}

Async代表异步函数。在 Redisson 中,所有带有 Async 后缀的方法都是异步版本。
即它不会阻塞当前线程去等待 Redis 命令执行完成,而是立即返回一个 RFuture 对象。

Redisson 是基于 Netty 的 Redis 客户端,它天然是事件驱动 + 非阻塞 I/O。也就是说,一个线程可以同时管理成百上千个 Redis 连接请求,不需要为每个请求单独创建线程。

可重试机制:

boolean success = lock.tryLock(1, TimeUnit.MINUTES);
 Long ttl = tryAcquire(waitTime, leaseTime, unit, threadId);
  1. 如果ttlnull ,代表加锁成功直接返回true

    否则表明锁被占用,则去拿对方剩余的 TTL
    
  2. 订阅释放信号

  RFuture<RedissonLockEntry> subscribeFuture = subscribe(threadId);if (!subscribeFuture.await(time, MILLISECONDS)) { ... return false; }protected RFuture<RedissonLockEntry> subscribe(long threadId) {return pubSub.subscribe(getEntryName(), getChannelName());}String getChannelName() {return prefixName("redisson_lock__channel", getName());}

当别人unlock() 时会publish() 一条解锁消息。这里先订阅,再判断。

  1. 等待-重试的循环
while (true) {long cur = now();ttl = tryAcquire(...);           // 再抢一次if (ttl == null) return true;    // 抢到就直接返回time -= (now() - cur);           // 扣减剩余等待时间if (time <= 0) { acquireFailed(...); return false; }// 选择等待多久再试:取“锁的剩余TTL”和“自己的剩余等待time”的较小者cur = now();if (ttl >= 0 && ttl < time) {entry.getLatch().tryAcquire(ttl, MILLISECONDS);} else {entry.getLatch().tryAcquire(time, MILLISECONDS);}time -= (now() - cur);if (time <= 0) { acquireFailed(...); return false; }
}
http://www.zskr.cn/news/46802.html

相关文章:

  • 2025浸没式/液冷超充/新能源车/超充站领域实力厂家排行榜:中碳创新领衔,四大品牌重塑新能源车补能生态
  • 2025国内AI获客公司排行榜:全平台精准破局,4 家企业领跑抖音/快手/小红书获客赛道
  • HNOI2016 序列
  • 2025年山东画室机构实力推荐:济南大道画室领跑美术艺考培训新标准
  • 第三十八篇
  • 英语_阅读_The progress of technology_待读
  • 机动车登记证识别技术如何通过深度学习实现泛化能力提升
  • 深入解析:51单片机基础-矩阵按键
  • gmssl 国密标准下载
  • 英语_阅读_Computers_待读
  • 202511.11 - A
  • 数据采集_2
  • Linux服务器编程实践20-TCP服务 vs UDP服务:核心差异对比 - 详解
  • 当世人 逐渐将英雄遗忘 我最终展露了疯狂 与烧灼许久的欲望 已无人描绘 我的画像
  • NOIP 2025 游记
  • FZNCTF2025-PWN-WP
  • 其他开源框架(PHP)
  • 如何在 Windows 中使用 Kimi CLI(PowerShell 补充版)
  • python项目跟练 外星人入侵 01 3个位置
  • 类的继承
  • 豆包Seed-Coder编程能力小试
  • 数据类型 标识符 键盘录入
  • 详细介绍:Spring Boot
  • `1
  • echarts获取坐标上的点距离顶部底部高度
  • ORACLE解析游标生成JSON
  • 习题解析之:鸡兔同笼
  • DeepSeek权威测评榜单2025年11月最新geo优化公司推荐
  • ECB33-PGB2N4E32-I单板机智能交通监控应用方案解析
  • 深入解析:第三方课题验收测试机构:【API测试工具Apifox使用指南】