Redisson 原子计数器与分布式ID生成:AtomicLong、LongAdder 与 IdGenerator 实战指南

发布时间:2026/9/17 7:41:23
Redisson 原子计数器与分布式ID生成:AtomicLong、LongAdder 与 IdGenerator 实战指南 Redisson 原子计数器与分布式ID生成AtomicLong、LongAdder 与 IdGenerator 实战指南【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redissonRedisson是最流行的 Valkey Redis Java 客户端与实时数据平台提供了 50 多种基于 Redis 的 Java 对象与服务。本文聚焦其中三个高频刚需组件原子计数器 RAtomicLong、高并发累加器 RLongAdder与分布式ID生成器 RIdGenerator帮你快速搞懂它们的工作原理、性能差异与选型方法适用于秒杀库存扣减、订单号生成、分布式指标统计等分布式计数与ID分配场景。 1. 为什么本地 AtomicLong 不够用在单机 Java 应用中java.util.concurrent.atomic.AtomicLong足以应对计数需求。但一旦应用水平扩容为多实例部署问题就来了场景单机 AtomicLong分布式场景需要库存扣减只统计本节点多节点共享同一份数据订单号/ID重启即重置重启不丢失、全局唯一在线人数各节点各自为政全集群实时求和Redisson 的解决方案是把计数器托管到 Redis/Valkey 服务器所有节点操作同一个键且每次操作都在服务端以原子命令执行天然强一致。 2. RAtomicLong强一致的分布式原子计数器2.1 基本操作与两族方法RAtomicLong的 API 与 JDK 的AtomicLong几乎一一对应。需要特别注意的是它把方法分成两族返回值含义不同这一点很多新手会踩坑incrementAndGet/addAndGet/decrementAndGet先变更返回变更后的新值getAndIncrement/getAndAdd/getAndDecrement先读旧值返回变更前的值RAtomicLong counter redisson.getAtomicLong(myCounter); counter.set(3); long after counter.incrementAndGet(); // 返回 4变更后的值 long before counter.getAndAdd(5); // 返回 5变更前的值从源码可以看到这些方法分别映射到 Redis 原生的INCR、INCRBY、DECR命令例如incrementAndGet就是服务端原子的INCR见 RedissonAtomicLong.java。2.2 进阶CAS 与条件更新除了自增自减RAtomicLong还提供三个高级积木方法作用典型用途compareAndSet(期望值, 新值)值仍等于期望值时才更新无锁协调、任务抢占setIfGreater / setIfLess仅在大于/小于边界时才更新一步完成限幅clampgetAndDelete读取并删除一步完成一次性领取配额compareAndSet是分布式无锁重试的基石——例如多个 worker 争抢任务只有一个能成功把状态从 0 改成 1见 RedissonAtomicLong.java 的 Lua 脚本实现RAtomicLong state redisson.getAtomicLong(job:42:state); boolean claimed state.compareAndSet(0, 1); // 只有第一个 worker 返回 truesetIfGreater则能一步把计数器限制在上限内天然适合配额控制RAtomicLong used redisson.getAtomicLong(quota:user:7); boolean capped used.setIfGreater(1000, 1000); // 超过 1000 就压回 10002.3 适用场景顺序号/流水号每次调用都严格递增跨所有实例唯一适合订单号、工单号实时双向计数器活跃会话数、在途请求数随时get()都是精确当前值配额与守护逻辑基于 CAS 的一次性动作认领它的代价是每次操作都是一次网络往返吞吐量受网络限制。 3. RLongAdder写 12000 倍快的记账式累加器如果计数器写得多、读得少典型如 QPS 统计、事件计数RAtomicLong的每次网络往返就是瓶颈。RLongAdder借鉴了 JDKLongAdder的思路每个客户端实例在本地内存中累加add/increment/decrement完全不走网络官方基准测试中高竞争下写入可比等价的 AtomicLong快约 12000 倍代价在读取端sum()需要向所有实例广播协调消息、把各自本地值汇总reset()也会清空所有实例。从源码看每个实例内部就是一个 JDKLongAdderRedissonLongAdder.java而跨实例求和是通过一个发布订阅 Topic 分布式信号量实现的点名汇总流程RedissonBaseAdder.java发起sum的实例发布求和消息 → 其他实例收到后把本地值原子加到临时键并释放信号量 → 发起方收齐所有人份后取走汇总值。RLongAdder requests redisson.getLongAdder(metrics:requests); requests.increment(); // 热路径纯本地无网络往返 requests.add(batchSize); long total requests.sum(); // 偶尔才读一次全集群总和窗口计数是它的招牌用法一个统计窗口结束时先sum()取出总量再reset()清零进入下一个窗口。用完记得调用destroy()释放客户端状态。 4. RIdGenerator批量申领的分布式ID生成器RIdGeneratorRedissonIdGenerator.java解决的是高性能全局唯一 ID问题核心机制是批量分段batch allocation首次申领从 Redis 一次性预取一块号码段默认 5000 个可通过tryInit(起始值, 段大小)自定义如 20000本地发号段内的号码在本机内存里递增发出nextId()零网络往返只在段耗尽时才回源领取下一段见源码中的handleIdRequests逻辑RedissonIdGenerator.java多实例并存每个实例各自持有独立的号段因此 ID 全局唯一但不保证严格单调递增——不同实例发的号会交织在一起号段可能浪费实例重启时未用完的号段直接作废序号会向前跳一段。RIdGenerator generator redisson.getIdGenerator(generator); generator.tryInit(12, 20000); // 只生效一次首调者赢其余节点无副作用 long id generator.nextId(); // 绝大多数时候直接从本地号段返回几个实战要点tryInit可放心在每个节点启动时都调用——它只初始化一次后续调用都是安全的空操作段大小是主要调优旋钮段越大吞吐越高、号段跳跃风险越大要求无空洞就选小段典型用途应用侧生成主键ID 在落库前就已知可提前返回和批量写入、高吞吐事件/任务打标、跨服务关联 IDcorrelation id⚖️ 5. 三兄弟怎么选一张表看懂维度RAtomicLongRLongAdderRIdGenerator每次写操作1 次网络往返纯本地内存纯本地内存段内读操作get()强一致、实时sum()需全集群协调较重无需读序号特性严格单调递增、无空洞只有总和无序号唯一但非单调、可能有跳跃适用场景订单号、实时计数、配额高并发指标、窗口统计主键、事件ID、Trace ID一句话定位精确优先写入吞吐优先发号吞吐优先选型口诀要精确、严格递增、随时可读→RAtomicLong写极频繁、读极少监控计数类 →RLongAdder还有对应的RDoubleAdder处理小数累计要海量发 ID、不在乎顺序→RIdGenerator要唯一且严格递增的 ID→RAtomicLong.incrementAndGet()牺牲吞吐换顺序 6. 延伸学习计数器与ID生成器官方文档docs/data-and-services/counters.mdAPI 接口定义RAtomicLong.java、RLongAdder.java、RIdGenerator.java三种对象均提供Sync / Async / Reactive / RxJava3四套 API接口定义位于 api/ 目录若需要读写锁等更复杂的并发控制可继续阅读 docs/data-and-services/locks-and-synchronizers.md小贴士RAtomicLong还支持IncrByListener监听器——当值被INCRBY变更时触发回调RedissonAtomicLong.java可以基于它实现库存低于阈值自动告警这类需求无需轮询。【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询