当前位置: 首页 > 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.jsqmd.com/news/37828/

相关文章:

  • 2025发泡混凝土优质厂家推荐榜:云南锦乐五星领跑,西南三家企业凭特色实力入围
  • 2025篷房行业优选榜:华烨海特斯五星领跑 铝合金 / 装配式 / 工业篷房领域 4 家实力企业精准适配多场景
  • 2025浸没式/液冷超充/新能源车/超充站领域实力厂家排行榜:中碳创新领衔,四大品牌重塑新能源车补能生态
  • 2025国内AI获客公司排行榜:全平台精准破局,4 家企业领跑抖音/快手/小红书获客赛道
  • HNOI2016 序列
  • 2025年山东画室机构实力推荐:济南大道画室领跑美术艺考培训新标准
  • 编程老鸟请注意
  • stm32使用SPI写W25Q32
  • 2025年济南画室培训机构最新推荐:济南画室/济南艺考画室/山东美术艺考培训/山东画室/专业教学,个性化辅导新标杆
  • Flutter零基础极速入门到进阶实战(视频教程) - 教程
  • 题解 P13524 [KOI 2025 #2] 跳跃
  • SOS DP
  • docker - 1 安装
  • 11月10日
  • 最小二乘困难详解5:非线性最小二乘求解实例
  • ##题解##洛谷P1578##最大子矩形 扫描线法
  • 【Azure Developer】azd 安装最新版无法登录中国区问题二:本地Windows环境遇问题
  • 密码校验函数
  • 英语_阅读_The progress of technology_待读
  • Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程(附安装包)
  • 机动车登记证识别技术如何通过深度学习实现泛化能力提升
  • 在R中生成交互地图leaflet包
  • 深入解析:51单片机基础-矩阵按键
  • gmssl 国密标准下载
  • 没有路由器的情况下如何通过电脑网口连接开发板
  • 重练算法(代码随想录版) day 7 -哈希表part2
  • 团队作业2——《需求规格说明书》
  • gmssl常用命令 - 需要持续更新
  • 实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型
  • 转转客服IM聊天系统背后的技术挑战和实践分享