【分布式】分布式核心组件——分布式锁:Redis/ZooKeeper/etcd 实现方案(附全方位对比表)、优缺点、Redlock、时钟回拨问题

文章目录

  • 分布式锁系统性知识体系全解
    • 一、分布式锁基础认知(核心地基)
    • 二、主流分布式锁实现方案深度拆解
      • [2.1 Redis 分布式锁实现方案](#2.1 Redis 分布式锁实现方案)
        • [2.1.1 核心实现原理](#2.1.1 核心实现原理)
        • [2.1.2 基础版实现(SET NX PX)](#2.1.2 基础版实现(SET NX PX))
        • [2.1.3 工业级实现(Redisson 可重入锁)](#2.1.3 工业级实现(Redisson 可重入锁))
        • [2.1.4 核心优缺点](#2.1.4 核心优缺点)
      • [2.2 ZooKeeper 分布式锁实现方案](#2.2 ZooKeeper 分布式锁实现方案)
        • [2.2.1 核心实现原理](#2.2.1 核心实现原理)
        • [2.2.2 标准公平锁实现流程](#2.2.2 标准公平锁实现流程)
        • [2.2.3 工业级实现](#2.2.3 工业级实现)
        • [2.2.4 核心优缺点](#2.2.4 核心优缺点)
      • [2.3 etcd 分布式锁实现方案](#2.3 etcd 分布式锁实现方案)
        • [2.3.1 核心实现原理](#2.3.1 核心实现原理)
        • [2.3.2 标准实现流程](#2.3.2 标准实现流程)
        • [2.3.3 工业级实现](#2.3.3 工业级实现)
        • [2.3.4 核心优缺点](#2.3.4 核心优缺点)
    • 三、三大实现方案核心维度横向对比
    • [四、进阶专题1:Redlock 红锁算法深度解析](#四、进阶专题1:Redlock 红锁算法深度解析)
    • 五、进阶专题2:分布式锁的时钟回拨问题全解
      • [5.1 时钟回拨的根因与发生场景](#5.1 时钟回拨的根因与发生场景)
      • [5.2 时钟回拨对不同分布式锁的影响差异](#5.2 时钟回拨对不同分布式锁的影响差异)
      • [5.3 时钟回拨问题的完整解决方案](#5.3 时钟回拨问题的完整解决方案)
        • [5.3.1 Redis场景下的解决方案](#5.3.1 Redis场景下的解决方案)
          • [1. 工程层面的时钟管控](#1. 工程层面的时钟管控)
          • [2. 框架层面的内置防护(Redisson)](#2. 框架层面的内置防护(Redisson))
          • [3. 业务层面的兜底优化](#3. 业务层面的兜底优化)
        • [5.3.2 架构层面的根治方案](#5.3.2 架构层面的根治方案)
    • 六、分布式锁选型指南与最佳实践
      • [6.1 场景化选型建议](#6.1 场景化选型建议)
      • [6.2 工业级落地最佳实践](#6.2 工业级落地最佳实践)
      • [6.3 常见避坑指南](#6.3 常见避坑指南)

分布式锁系统性知识体系全解

本文从基础原理、工业级实现、核心对比、进阶专题到落地实践,全方位结构化拆解分布式锁核心知识,完整覆盖Redis/ZooKeeper/etcd实现方案、Redlock算法、时钟回拨问题等核心内容。


一、分布式锁基础认知(核心地基)

1.1 核心定义与解决的问题

分布式锁是分布式系统中控制多节点/多进程并发访问共享资源的同步原语,核心解决分布式环境下,跨JVM/跨主机的进程无法使用本地锁(如Synchronized、ReentrantLock)保证操作原子性、数据一致性的问题,是分布式系统并发控制的核心组件。

1.2 分布式锁核心特性

必备核心特性(缺一不可)
  1. 强互斥性:同一时刻,只有一个客户端能持有锁(最核心要求)
  2. 防死锁能力:即使持有锁的客户端崩溃、网络断开,锁最终可被安全释放,不阻塞后续业务
  3. 身份唯一性:只能由加锁的客户端释放锁,禁止其他客户端误释放
  4. 容错性:多数节点正常运行时,就能持续提供锁服务,无单点故障风险
可选增强特性
  • 可重入性:同一客户端持有锁期间,可重复加锁不阻塞
  • 公平性:按请求先后顺序分配锁,先到先得
  • 自动续约:业务执行超时前,自动延长锁的有效期,避免锁提前释放
  • 非阻塞能力:支持tryLock,获取失败立即返回,不无限阻塞
  • 可中断性:持有锁过程中可响应中断,主动释放锁

1.3 核心设计约束

分布式锁的设计本质是在性能、一致性、可用性三者之间做权衡,对应CAP定理:

  • AP型锁:优先保证可用性和分区容错性,牺牲强一致性(如Redis分布式锁)
  • CP型锁:优先保证一致性和分区容错性,牺牲部分可用性(如ZooKeeper/etcd分布式锁)

二、主流分布式锁实现方案深度拆解

2.1 Redis 分布式锁实现方案

Redis分布式锁是业界高并发场景的首选方案,核心基于Redis单线程模型的命令原子性实现。

2.1.1 核心实现原理

利用Redis单线程串行执行命令的特性,通过原子命令实现「key不存在才写入」的互斥逻辑,配合过期时间实现死锁防护,通过Lua脚本保证加锁/解锁/续约的原子性。

2.1.2 基础版实现(SET NX PX)

这是Redis分布式锁的最小可行实现,核心解决基础互斥和死锁问题:

  1. 加锁原子命令 (必须单条执行,禁止拆分SETNX+EXPIRE)

    复制代码
    SET lock_key unique_client_id NX PX 30000
    • lock_key:锁的唯一标识,对应共享资源
    • unique_client_id:客户端唯一标识(UUID+线程ID),保证锁只能被加锁者释放
    • NX:Only Set if Not Exists,key不存在才写入,实现互斥
    • PX 30000:设置30秒过期时间,客户端崩溃后锁自动释放,防死锁
  2. 解锁原子操作 (必须用Lua脚本,保证校验+删除的原子性)

    lua 复制代码
    if redis.call('get', KEYS[1]) == ARGV[1] then
        return redis.call('del', KEYS[1])
    else
        return 0
    end
2.1.3 工业级实现(Redisson 可重入锁)

开源框架Redisson是Redis分布式锁的业界标准实现,解决了基础版的所有缺陷,核心能力:

  1. 可重入锁实现:基于Hash结构存储客户端标识+重入次数,加锁/解锁通过Lua脚本保证原子性,重入时仅递增计数,解锁时递减计数,计数为0才真正删除锁
  2. WatchDog看门狗自动续约:默认锁过期时间30秒,客户端加锁成功后,每10秒自动续期重置为30秒,只要客户端存活就持续续约,彻底解决业务执行超时导致的锁提前释放问题
  3. 丰富的锁类型:支持公平锁、非公平锁、读写锁、红锁、联锁等全场景锁实现
  4. 集群容错:适配Redis主从、哨兵、集群模式,降低主从切换的锁丢失风险
2.1.4 核心优缺点
优势 劣势
性能极高,纯内存操作,单实例QPS可达10万+,适配高并发场景 基于AP模型,主从切换时存在锁丢失风险,无法保证强一致性
部署简单,运维成本低,绝大多数业务系统已部署Redis集群 锁过期时间强依赖本地时钟,存在时钟回拨导致的锁失效致命风险
生态成熟,Redisson提供了开箱即用的工业级实现,无需重复造轮子 默认非公平锁,实现公平锁成本高,存在惊群效应风险

2.2 ZooKeeper 分布式锁实现方案

ZooKeeper分布式锁是强一致性场景的经典实现,核心基于ZNode节点特性+Watcher监听机制实现。

2.2.1 核心实现原理

依托ZooKeeper的ZNode核心特性:

  1. 临时节点:客户端会话创建的临时节点,会话断开/超时后自动删除,天然解决死锁问题
  2. 有序节点:在同一父节点下创建的有序节点,会自动按创建顺序分配全局递增的序号,天然实现公平性
  3. Watcher机制:客户端可监听节点的删除/变更事件,事件触发时收到异步通知,无需轮询,避免CPU空转
2.2.2 标准公平锁实现流程
  1. 客户端加锁时,先创建锁的持久父节点(如/distributed_lock
  2. 客户端在父节点下,创建临时有序节点 ,格式如/distributed_lock/seq-0000000001
  3. 客户端获取父节点下的所有子节点,判断自己创建的节点是否为当前序号最小的节点
  4. 若为最小节点:成功获取锁,执行业务逻辑
  5. 若不是最小节点:监听自己前一个序号的节点的删除事件,阻塞等待
  6. 锁释放:持有锁的客户端主动删除节点,或会话断开/超时后临时节点自动删除;监听的客户端收到节点删除通知后,重复步骤3,判断自己是否为最小节点,是则获取锁
  7. 可重入实现:通过ThreadLocal记录当前线程持有的节点路径和重入次数,重入时直接返回成功,无需重复创建节点
2.2.3 工业级实现

Apache Curator框架的InterProcessMutex是ZooKeeper分布式锁的标准实现,完整实现了上述流程,同时优化了羊群效应、会话超时、可重入性等问题,开箱即用。

2.2.4 核心优缺点
优势 劣势
基于CP模型,ZAB协议保证强一致性,无锁丢失风险,安全性极高 性能中等,写操作需半数节点同步,QPS仅万级,不适合超高并发场景
天然防死锁(临时节点)、天然公平性(有序节点),无需额外处理过期时间 部署运维成本高,需要独立维护ZooKeeper集群,节点越多性能越差
Watcher机制避免轮询,锁释放实时通知,无惊群效应(仅监听前一个节点) 会话超时风险:客户端GC停顿导致心跳中断,会话过期,节点被删除,锁意外释放
完全不依赖本地时钟,无时钟回拨问题 不适合短生命周期的锁场景,节点创建/删除开销大

2.3 etcd 分布式锁实现方案

etcd分布式锁是云原生场景的主流方案,基于Raft共识算法、Lease租约、全局Revision版本号实现,兼顾强一致性与性能。

2.3.1 核心实现原理

依托etcd的核心特性:

  1. Raft共识算法:保证集群数据强线性一致性,写操作需半数节点同步,无主从切换数据丢失风险
  2. Lease租约机制:客户端创建租约设置TTL,绑定锁key,租约过期自动删除key;通过KeepAlive心跳自动续约,防死锁
  3. 全局递增Revision:etcd每一次写操作都会生成一个全局唯一、递增的版本号,天然实现全局有序,无需依赖节点序号
  4. 高性能Watch机制:支持范围监听、事件聚合,比ZooKeeper的Watcher更稳定,无羊群效应
2.3.2 标准实现流程
非公平锁实现
  1. 客户端创建Lease租约,设置TTL(如10秒),并启动KeepAlive自动续约
  2. 客户端通过CAS原子操作写入锁key,携带租约ID,仅当key不存在时写入成功(对应Redis的NX),写入成功则获取锁
  3. 若写入失败,通过Watch机制监听锁key的删除事件,阻塞等待通知,收到通知后再次尝试抢锁
  4. 锁释放:客户端主动删除key,或租约过期/心跳中断自动删除key
公平锁实现(主流方案)
  1. 客户端创建Lease租约,设置TTL并启动自动续约
  2. 客户端写入带前缀的锁key(如/lock/+客户端唯一ID),写入后获取该key对应的全局Revision
  3. 客户端获取/lock/前缀下的所有key,对比Revision,判断自己的Revision是否为当前最小
  4. 若为最小Revision:成功获取锁
  5. 若不是最小Revision:监听前一个Revision的key的删除事件,阻塞等待,收到通知后重复步骤3
  6. 锁释放:主动删除key或租约过期自动删除
2.3.3 工业级实现

etcd官方提供了concurrency包,内置了完整的分布式锁实现,开箱即用,无需手动处理租约、Revision、Watch等底层逻辑。

2.3.4 核心优缺点
优势 劣势
基于Raft协议的强线性一致性,安全性极高,无锁丢失风险 性能弱于Redis,写操作需半数节点同步,QPS万级,不适合超高并发场景
完全不依赖本地时钟,租约由集群统一管理,无时钟回拨问题 部署运维有一定门槛,适合已有etcd集群的云原生场景
Lease+KeepAlive机制天然解决死锁和锁续约问题,Revision天然实现公平锁 不适合极短生命周期的锁场景,Raft同步有固定开销
Watch机制更稳定,支持断点续传,无ZooKeeper的会话过期和Watcher一次性失效问题 生态成熟度弱于Redis和ZooKeeper

三、三大实现方案核心维度横向对比

对比维度 Redis分布式锁 ZooKeeper分布式锁 etcd分布式锁
一致性模型 最终一致性(AP) 线性一致性(CP) 线性一致性(CP)
核心互斥机制 SET NX原子命令 临时有序节点全局序号 全局递增Revision+CAS
死锁防护方案 过期时间+唯一值校验 临时节点(会话断开自动删除) Lease租约过期自动删除
可重入性 支持(Redisson Hash+Lua) 支持(Curator ThreadLocal计数) 支持(官方concurrency包)
公平性 默认非公平,实现成本高 天然公平 天然支持公平锁
自动续约 支持(Redisson WatchDog) 会话心跳自动续约 支持(Lease KeepAlive)
核心性能 极高(单实例QPS 10万+) 中等(QPS 万级) 中等(QPS 万级,优于ZK)
高可用保障 主从/哨兵/集群,依赖主节点 集群半数节点可用即可服务 集群半数节点可用即可服务
单点故障风险 单主模式存在,主从切换可能丢锁 无,CP集群保障 无,CP集群保障
时钟回拨影响 严重(过期时间强依赖本地时钟) 无影响(不依赖绝对时钟) 无影响(租约由集群统一管理)
羊群效应 非公平锁无,公平锁易出现 Curator优化后无 无(精准监听前一个Revision)
核心适用场景 高并发、高性能优先,非核心业务(秒杀、限流、缓存更新) 强一致性、低并发场景(分布式任务调度、金融交易、数据同步) 云原生/K8s生态,兼顾一致性与可靠性的场景

四、进阶专题1:Redlock 红锁算法深度解析

4.1 提出背景

Redlock是Redis作者Antirez提出的分布式锁算法,核心解决单实例/主从架构Redis锁的致命缺陷:主节点加锁成功后,锁数据还未同步到从节点,主节点宕机,从节点升级为新主,原锁完全丢失,导致多个客户端同时持有锁,彻底破坏互斥性。

4.2 算法核心前提与流程

核心前提
  1. 部署N个完全独立的Redis主节点(无主从、无集群关联,无数据同步,官方推荐N=5,奇数)
  2. 所有节点使用相同的锁key和客户端唯一value
  3. 锁的过期时间统一,单节点加锁请求超时时间远小于锁过期时间(避免单节点故障阻塞)
加锁核心流程
  1. 客户端获取当前本地时间戳T1(毫秒级)
  2. 客户端使用相同的lock_keyunique_client_id按顺序向N个Redis节点发起加锁请求,每个请求都设置独立的超时时间(如5-50ms),节点故障时快速跳过
  3. 客户端统计成功加锁的节点数量K,并计算加锁总耗时T_total = 当前时间T2 - T1
  4. 加锁成功必须同时满足两个核心条件:
    • 成功加锁的节点数 K ≥ N/2 + 1(5个节点需≥3个成功,达成多数派)
    • 锁的剩余有效时间 = 锁总过期时间 - T_total > 0
  5. 若满足条件,加锁成功,锁的有效时间以剩余时间为准;若不满足,立即向所有N个节点发起解锁请求(无论该节点是否加锁成功)
解锁流程

向所有N个节点发送Lua解锁脚本,校验客户端唯一value匹配后,删除锁key,保证原子性。

4.3 业界核心争议(Martin vs Antirez 论战)

Redlock自提出以来,引发了分布式系统领域的经典论战,核心是分布式系统专家Martin Kleppmann与Redis作者Antirez的观点对抗。

Martin的核心质疑(Redlock不安全)
  1. 强依赖时钟稳定性,存在致命安全漏洞:Redlock的正确性完全依赖多个Redis节点的本地时钟,若某个节点时钟回拨/时钟漂移,会导致锁提前过期,多个客户端同时持有锁;NTP同步、虚拟机迁移、硬件时钟故障都会触发该问题
  2. 无法解决GC停顿/网络延迟导致的锁失效:客户端加锁成功后,发生Full GC停顿,停顿时间超过锁过期时间,锁自动释放,另一个客户端成功加锁;GC恢复后,原客户端仍认为自己持有锁,会并发修改共享资源,Redlock无法防护
  3. 缺少fencing token机制:Redlock没有提供全局递增的令牌,无法解决锁失效后,延迟的旧请求仍修改共享资源的问题,无法从根本上保证数据一致性
Antirez的核心反驳
  1. 时钟问题是工程可管控的:Redlock的设计要求节点时钟必须稳定,NTP同步仅允许平滑调整,禁止跳变;生产环境可通过监控、时钟隔离管控时钟风险,属于工程可解问题
  2. GC停顿问题是所有带过期时间的锁的共性问题:无论Redis、ZooKeeper还是etcd,只要锁有过期时间,都无法解决超过过期时间的GC停顿问题,并非Redlock独有
  3. fencing token可通过Redis实现:可通过锁的唯一value、全局递增版本号实现fencing token能力,并非Redlock的核心缺陷

4.4 适用场景、局限性与落地建议

核心局限性
  1. 仍未彻底解决时钟回拨问题,只是降低了发生概率
  2. 部署运维成本极高,需要维护多个独立的Redis主节点
  3. 性能比单实例Redis锁下降50%以上,需多次跨节点请求
  4. 多数节点故障时,锁服务完全不可用
  5. 无法提供强一致性保证,不适合金融级核心场景
适用场景

仅适合对锁的安全性有一定要求、能接受性能损耗、可严格管控节点时钟的场景,不适合零容忍数据不一致的核心交易场景。

落地建议

生产环境优先使用Redisson封装的RedissonRedLock实现,无需手动编写算法逻辑;同时必须配套节点时钟监控、时钟回拨防护机制。


五、进阶专题2:分布式锁的时钟回拨问题全解

5.1 时钟回拨的根因与发生场景

时钟回拨指服务器的本地系统时间,从当前时刻跳转到过去的时刻,核心触发场景:

  1. NTP时间同步:最常见原因,NTP服务会将本地时钟同步到网络标准时间,若本地时钟比网络时间快,会触发回拨
  2. 虚拟化环境问题:虚拟机迁移、宿主机时钟调整、容器化环境的时钟隔离失效,都会导致客户机时钟回拨
  3. 硬件与人工操作:物理机硬件时钟故障、运维人员手动修改系统时间
  4. 闰秒调整:UTC时间的闰秒调整,可能导致系统时钟回拨1秒

5.2 时钟回拨对不同分布式锁的影响差异

实现方案 影响程度 核心原因
Redis分布式锁 致命影响 锁的过期时间完全基于Redis服务端的本地时钟计算,时钟回拨会导致锁提前过期,破坏互斥性;Redlock只要有一个节点时钟回拨,就可能导致锁失效
ZooKeeper分布式锁 完全无影响 锁的生命周期基于会话(Session)的心跳机制,仅依赖会话的TickTime心跳间隔,与本地绝对时钟无关,不会因时钟回拨导致锁提前释放
etcd分布式锁 完全无影响 租约的生命周期由etcd集群的Raft共识逻辑统一管理,仅依赖客户端与集群的KeepAlive心跳,与物理时钟无关,无时钟回拨风险

5.3 时钟回拨问题的完整解决方案

5.3.1 Redis场景下的解决方案
1. 工程层面的时钟管控
  • 禁用Redis服务端的NTP自动同步,或配置NTP为平滑同步模式,禁止时钟跳变,仅允许毫秒级缓慢调整
  • 搭建Redis节点时钟监控系统,一旦检测到时钟回拨超过阈值(如100ms),立即将节点下线,禁止参与加锁/Redlock计算
  • 虚拟化/容器化环境中,关闭宿主机对容器的时钟同步,使用独立的时钟源,避免迁移导致的时钟跳变
2. 框架层面的内置防护(Redisson)
  • 时钟检测机制:Redisson会周期性获取Redis服务端的时钟,若检测到时钟回拨超过阈值,会抛出异常,拒绝加锁操作
  • WatchDog续约机制:锁的过期时间不是一次性设置,而是每10秒自动续期,即使时钟小幅回拨,续期操作也会覆盖过期时间,避免锁提前失效
  • 原子性Lua脚本:加锁、续期、解锁均通过Lua脚本保证原子性,避免时钟异常导致的逻辑错乱
3. 业务层面的兜底优化
  • 锁的过期时间设置远大于业务最大执行时间,减少时钟回拨的影响占比,禁止设置小于1秒的超短过期时间
  • 业务操作增加乐观锁兜底,如数据库的版本号机制、唯一索引约束,即使锁失效,也不会导致脏数据
5.3.2 架构层面的根治方案
  1. 优先选择无时钟依赖的CP型锁:核心业务、强一致性场景,直接放弃Redis分布式锁,改用ZooKeeper/etcd实现的分布式锁,从根本上消除时钟回拨风险
  2. 引入fencing token fencing令牌机制:给每个锁分配全局递增的令牌,共享资源的写操作必须携带令牌,且仅当令牌大于当前已处理的最大令牌时,才允许执行,彻底解决时钟回拨、GC停顿、网络延迟导致的锁失效问题
  3. 禁用业务系统的时钟回拨能力:核心服务器关闭NTP自动同步,使用GPS时钟等硬件时钟源,从源头避免时钟回拨

六、分布式锁选型指南与最佳实践

6.1 场景化选型建议

  1. 首选Redis分布式锁:高并发、高性能优先,业务对一致性要求非极致,如电商秒杀、接口限流、缓存更新互斥、幂等性控制,优先使用Redisson实现
  2. 首选ZooKeeper分布式锁:强一致性、高可靠优先,低并发场景,如分布式任务调度、金融交易对账、数据同步、主节点选举,优先使用Curator实现
  3. 首选etcd分布式锁:云原生/K8s生态、容器化部署场景,兼顾一致性与可靠性,优先使用官方concurrency包实现
  4. 禁止使用Redlock:金融级核心交易、零容忍数据不一致的场景,禁止使用Redis/Redlock,优先选择etcd/ZooKeeper

6.2 工业级落地最佳实践

  1. 禁止手动实现分布式锁:永远使用业界成熟的工业级实现(Redisson/Curator/etcd官方包),避免底层逻辑漏洞
  2. 锁粒度最小化:只保护共享资源的核心操作,锁的持有时间尽可能短,禁止在锁内执行远程调用、耗时IO等操作
  3. 强制加锁超时控制:所有加锁操作必须设置超时时间,避免业务无限阻塞
  4. 锁释放兜底:解锁操作必须放在finally代码块中,保证异常场景下锁可被释放
  5. 可重入性必须处理:业务中存在嵌套加锁场景时,必须使用可重入锁,避免死锁
  6. 强一致性场景必须兜底:核心业务无论使用哪种锁,都必须配套数据库乐观锁、唯一约束等兜底机制,避免锁失效导致的数据不一致

6.3 常见避坑指南

  1. 坑1:Redis使用SETNX+EXPIRE两条命令加锁,中间客户端崩溃导致死锁
  2. 坑2:释放锁不校验客户端唯一标识,误释放其他客户端的锁
  3. 坑3:锁过期时间设置过短,业务未执行完锁已释放,导致并发问题
  4. 坑4:Redis主从切换未做防护,导致锁丢失,多个客户端同时持有锁
  5. 坑5:ZooKeeper监听父节点所有变化,引发羊群效应,导致集群性能雪崩
  6. 坑6:忽略可重入性,同一客户端重复加锁导致死锁
  7. 坑7:云环境/虚拟机中使用Redis锁,未做时钟回拨防护,导致锁频繁失效
相关推荐
好家伙VCC2 小时前
**发散创新:用Rust实现基于RAFT共识算法的轻量级分布式日志系统**在分布式系统中,**一致性协议**是保障数据可靠
java·分布式·python·rust·共识算法
小江的记录本2 小时前
【分布式】分布式核心组件——分布式ID生成:雪花算法、号段模式、美团Leaf、百度UidGenerator、时钟回拨解决方案
分布式·后端·算法·缓存·性能优化·架构·系统架构
HTTP帕克猴子3 小时前
为什么现代网站越来越依赖“中间层架构”?
架构
晔子yy3 小时前
【JAVA探索之路】从头开始讲透、实现单例模式
java·开发语言·单例模式
GetcharZp8 小时前
拒绝低效!这款神器,让你的终端效率起飞 | 深度解析 fzf 终极指南
后端
chools8 小时前
【AI超级智能体】快速搞懂工具调用Tool Calling 和 MCP协议
java·人工智能·学习·ai
懂懂tty8 小时前
CRA 迁移 Rspack(实战)
前端·架构
李白你好8 小时前
TongWeb EJB 反序列化生成工具(Java-Chain 插件)
java·安全
自珍JAVA9 小时前
高效处理Long列表与集合运算:基于RoaringBitmap的工具类解析与应用场景
后端