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

Redisson RLocalCachedMap 核心参详解

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

Redisson RLocalCachedMap 核心参详解

RLocalCachedMap 简介

RLocalCachedMap 是 Redisson 框架中的核心分布式数据结构,专为高性能分布式系统设计。它在传统分布式缓存的基础上实现了革命性的突破——将 本地内存的速度优势Redis 分布式存储的一致性保障 完美融合。

在分布式集群环境中,频繁访问 Redis 会导致网络延迟成为瓶颈。RLocalCachedMap 通过在每个 JVM 实例本地维护热数据副本,使读取操作直接命中本地内存(微秒级响应),相比远程 Redis 访问(毫秒级)性能提升 1-2 个数量级。同时,它通过智能的 Pub/Sub 同步机制(支持 INVALIDATEUPDATE 策略),确保集群内任一节点修改数据时,所有实例的本地缓存实时失效或更新,从而在接近本地速度的体验下,提供了强一致性保证。

其核心价值在于解决分布式系统的 "速度与一致性"悖论

  • 对读密集型场景(如商品详情、用户会话):通过本地缓存扛住超高 QPS,降低 Redis 负载
  • 对数据一致性敏感场景(如库存、配置):通过实时同步避免脏读
  • 对带宽敏感场景:支持仅同步哈希值的最小化网络开销

RLocalCachedMap 是构建低延迟高吞吐分布式应用的基石技术,适用于电商、金融、实时分析等领域,显著提升系统扩展性与用户体验。

RLocalCachedMap 是 Redisson 提供的一种高性能分布式本地缓存结构,它结合了本地内存缓存的速度优势和 Redis 分布式存储的一致性。以下是对其核心配置参数的详细说明:


1. 缓存生存周期与容量 (Time & Capacity)

  • timeToLive (long, 单位:毫秒)

    • 作用: 定义本地缓存中每个条目(Entry)的最大存活时间。
    • 行为:
      • > 0:条目在本地缓存中存活指定毫秒数后自动过期并被移除。
      • = 0默认值。本地缓存条目永不过期(需依赖其他淘汰机制或显式删除)。
    • 注意: 此超时仅作用于本地缓存副本。Redis 主存储中的数据不受此设置影响(需通过 Redis 自身 TTL 设置)。
  • cacheSize (int)

    • 作用: 设置单个本地缓存实例允许存储的最大条目数量上限。
    • 行为: 当本地缓存条目数达到此阈值时,将根据 evictionPolicy 策略淘汰条目以腾出空间。
    • 重要性: 防止本地缓存无限增长导致 JVM OOM (OutOfMemoryError)。

2. 淘汰策略 (Eviction Policy)

  • evictionPolicy (EvictionPolicy 枚举)
    • 作用: 决定当本地缓存达到 cacheSize 限制或 JVM 需要内存时,如何选择条目进行淘汰(移除)。淘汰仅发生在本地缓存副本,不影响 Redis 主数据。
    • 策略详解:
      • NONE (无淘汰):
        • 不主动淘汰任何条目。条目一旦加载,除非 Redis 数据变更(通过 Pub/Sub 失效)或 JVM 回收(如使用引用策略),否则常驻内存。
        • 风险: 极易引发 OOM,仅适用于小型、固定、必须常驻的数据集。
      • LRU (最近最少使用 - Least Recently Used):
        • 淘汰原则: 优先淘汰最久未被访问(读取或写入)的条目。
        • 实现: 维护访问顺序链表(如链表头代表最近使用)。访问条目时将其移至链表头;淘汰时移除链表尾部的条目。
        • 适用场景: 推荐通用策略。适用于具有时间局部性(最近访问的很可能再次访问)的大多数场景。平衡内存使用与缓存命中率。
      • LFU (最不经常使用 - Least Frequently Used):
        • 淘汰原则: 优先淘汰使用频率最低的条目。
        • 实现: 为每个条目维护访问计数器。访问时计数器递增;淘汰时选择计数器值最小的条目。需处理计数器老化(防止历史高频但当前冷数据长期占用)。
        • 适用场景: 访问频率差异显著且稳定,需长期保留热点数据的场景(如热门商品信息)。
      • SOFT (软引用 - Soft Reference):
        • 淘汰原则: 不基于 cacheSize 主动淘汰。使用 java.lang.ref.SoftReference 包装缓存值对象。
        • 行为:
          • JVM 堆内存充足时:行为类似强引用,对象不被回收。
          • JVM 堆内存不足(即将 OOM)时:垃圾回收器(GC)优先回收仅被 SoftReference 引用的对象以释放内存。键通常保持强引用。
        • 适用场景: 存储大型对象或对内存极度敏感,作为防止 OOM 的最后手段。淘汰时机不可控(取决于 GC)。
      • WEAK (弱引用 - Weak Reference):
        • 淘汰原则:SOFT 更激进。使用 java.lang.ref.WeakReference 包装缓存值对象(键可能用 WeakReferenceSoftReference)。
        • 行为: 只要发生 GC,无论内存是否充足,垃圾回收器立即回收仅被 WeakReference 引用的对象。缓存值对象生命周期极短
        • 适用场景: 存储临时数据或对内存极度敏感、可接受低命中率的场景(如临时会话数据)。缓存非常短暂。

3. 写入模式 (Write Mode)

  • writeMode (WriteMode 枚举)
    • 作用: 控制通过 RLocalCachedMap 写入数据时如何与 MapWriter(用于持久化到外部存储,如数据库)交互。
    • 模式详解:
      • WRITE_BEHIND (异步写后):
        • 行为: 对 Map 的写入操作先成功写入本地缓存和 Redis,然后异步调用 MapWriter 写入外部存储。
        • 优点: 写入延迟低,性能高。
        • 缺点: 存在数据丢失风险(外部存储写入成功前应用崩溃);外部存储写入顺序无法严格保证。
        • 调优: 配合 writeBehindDelaywriteBehindBatchSize 使用。
      • WRITE_THROUGH (同步直写):
        • 行为: 对 Map 的写入操作同步调用 MapWriter 写入外部存储。只有 MapWriter 写入成功后,操作才被视为成功,数据写入本地缓存和 Redis。
        • 优点: 保证本地缓存/Redis 与外部存储的强一致性;写入外部存储的顺序有保证。
        • 缺点: 写入延迟较高(受外部存储性能影响)。
        • 错误处理: 如果 MapWriter 抛出异常,该异常会直接抛给 Map 操作调用方,数据不会写入本地缓存和 Redis。

4. 存储模式 (Store Mode)

  • storeMode (StoreMode 枚举)

    • 作用: 定义数据存储的位置和同步范围。
    • 模式详解:
      • LOCALCACHE (仅本地缓存):
        • 行为: 数据保存在当前 JVM 实例的本地内存中。写入 Redis,支持集群内其他实例的数据同步。
        • 特点: 速度最快,无网络开销。
        • 缺点: 数据非持久化;实例重启数据丢失;无法跨实例共享;无分布式一致性保证。
        • 适用场景: 纯本地缓存需求,数据不重要或可重建,无需集群共享(如单机应用的临时计算缓存)。
      • LOCALCACHE_REDIS (本地缓存 + Redis, 默认):
        • 行为: 数据同时写入当前 JVM 的本地内存 Redis 集群。支持通过 Pub/Sub 机制(syncStrategy)在集群实例间同步缓存变更。
        • 特点: 本地读取速度快;数据持久化在 Redis;支持分布式共享;通过 syncStrategy 提供一定一致性保证。
        • 适用场景: 推荐模式。需要本地高速读取 + 分布式数据共享/一致性 + 持久化的场景(如集群部署的共享配置、热点数据缓存)。
  • storeCacheMiss (boolean)

    • 作用: 控制是否缓存“键不存在”的结果。
    • 行为:
      • false (默认): 查询一个本地缓存和 Redis 中都不存在的键时,每次请求都会穿透到 Redis 查询,造成重复网络开销。
      • true (推荐开启): 首次查询不存在的键时,在本地缓存中存储一个特殊标记(如 Null 值)。后续对该键的请求直接在本地缓存命中此标记,返回“不存在”,避免重复穿透 Redis
    • 优点: 显著降低对不存在键的重复查询开销,提升性能(尤其防缓存穿透攻击)。
    • 注意: 需要配合合适的 timeToLiveevictionPolicy 清理这些“不存在”标记。

5. 同步策略 (Sync Strategy)

  • syncStrategy (LocalCachedMapOptions.SyncStrategy 枚举)
    • 作用: 当 Redis 中的数据(通过任何客户端)发生变更时,如何同步更新集群内所有 RLocalCachedMap 实例的本地缓存副本。仅在 storeMode = LOCALCACHE_REDIS 时生效。

    • 策略详解:

      策略传输内容网络开销本地行为后续访问延迟适用场景
      INVALIDATE变更条目的 16字节哈希值收到哈希值,移除对应本地条目数据更新不频繁;强一致性要求;带宽敏感
      UPDATE变更条目的完整键值对收到键值对,更新对应本地条目数据更新频繁;强一致性要求;可接受带宽消耗
      • INVALIDATE (失效):
        • 变更广播:仅广播变更条目的哈希值(16字节)。
        • 本地动作:其他实例收到哈希值后,移除本地缓存中对应的条目。
        • 后续访问:下次访问该键需从 Redis 重新加载最新值。
      • UPDATE (更新):
        • 变更广播:广播变更条目的完整键值对。
        • 本地动作:其他实例收到键值对后,直接更新本地缓存中的对应条目(若存在)。
        • 后续访问:可直接使用本地缓存中已更新的值。

6. 写入容错与异步批处理 (Write Resilience & Batching)

  • writeRetryAttempts (int)

    • 作用: 设置向 Redis 写入操作失败后的最大重试次数
    • 适用场景: 在网络不稳定或 Redis 短暂不可用时提高写入操作的可靠性。
    • 默认值: 通常为 3(具体依赖 Redisson 版本/配置)。
  • writeRetryInterval (long, 单位:毫秒)

    • 作用: 设置每次写入重试之间的等待间隔
    • 配合:writeRetryAttempts 一同使用。
  • writeBehindDelay (int, 单位:毫秒)

    • 作用: 仅在 writeMode = WRITE_BEHIND 时有效。设置异步写后任务执行的最大延迟时间。所有更新操作会累积,延迟不超过此值后批量提交给 MapWriter
    • 调优: 值越大,可能累积的批量操作越多,减少 MapWriter 调用次数,提高吞吐量,但数据延迟持久化的风险增大。
  • writeBehindBatchSize (int)

    • 作用: 仅在 writeMode = WRITE_BEHIND 时有效。设置异步写后任务的批处理大小。当累积的更新操作数量达到此阈值时,立即触发一次批量提交给 MapWriter,即使未达到 writeBehindDelay
    • 调优: 值越大,单次 MapWriter 调用处理数据越多,吞吐量越高,但单次调用延迟可能增加。与 writeBehindDelay 共同控制批处理行为。

总结与配置建议

  1. 基础配置 (storeMode, cacheSize, evictionPolicy, timeToLive): 根据数据特性(大小、重要性、更新频率)和内存限制设定。LOCALCACHE_REDIS + LRU + 合理 cacheSize/timeToLive 是通用起点。storeCacheMiss=true 强烈推荐开启以优化不存在键的查询。
  2. 一致性策略 (syncStrategy): 在带宽(INVALIDATE)与读性能(UPDATE)间权衡。高频读低频写选 INVALIDATE;高频写高频读且强一致选 UPDATE
  3. 持久化模式 (writeMode): 需要额外持久化到 DB 时选择。追求性能选 WRITE_BEHIND(配合调优 writeBehind* 参数);追求强一致选 WRITE_THROUGH
  4. 容错 (writeRetry*): 网络环境不稳定时适当增加重试次数和间隔。
  5. 监控与调优: 密切监控本地缓存大小、命中率、网络带宽(尤其 UPDATE 策略)和 Redis 负载,根据实际情况调整参数(如 cacheSize, timeToLive, writeBehind*)。

示例配置片段 (Java):

LocalCachedMapOptions<String, MyData> options = LocalCachedMapOptions.<String, MyData>defaults().cacheSize(1000)                      // 本地缓存最大1000条.timeToLive(10 * 60 * 1000)           // 本地条目10分钟过期.evictionPolicy(EvictionPolicy.LRU)   // 使用LRU淘汰.storeMode(StoreMode.LOCALCACHE_REDIS) // 本地+Redis存储.storeCacheMiss(true)                 // 缓存"不存在"结果.syncStrategy(SyncStrategy.UPDATE)    // 使用UPDATE同步策略.writeMode(WriteMode.WRITE_BEHIND)    // 异步写后模式.writeBehindDelay(500)                // 最大延迟500ms批处理.writeBehindBatchSize(50)             // 每批最多50条.writeRetryAttempts(5)                // 写入重试5次.writeRetryInterval(1000);            // 重试间隔1秒RLocalCachedMap<String, MyData> hotDataCache = redisson.getLocalCachedMap("hotDataCache", options);

通过合理配置这些参数,RLocalCachedMap 能在分布式系统中有效平衡性能、内存消耗、数据一致性和可靠性。

http://www.xdnf.cn/news/15758.html

相关文章:

  • kotlin部分常用特性总结
  • Ultralytics代码详细解析(三:engine->trainer.py主框架)
  • LVS——nat模式
  • 电机相关常见名词
  • 如何解决Flink CDC同步时间类型字段8小时时间差的问题,以MySQL为例
  • Redis Sentinel哨兵集群
  • Spring之【AnnotatedBeanDefinitionReader】
  • 针对大规模语言模型的上下文工程技术调研与总结(翻译并摘要)
  • 【C++】入门阶段
  • 基于开放API接口采集的定制开发开源AI智能名片S2B2C商城小程序数据整合与增长策略研究
  • 本地部署开源的 AI 驱动的搜索引擎 Perplexica 并实现外部访问
  • Spring Bean 的作用域(Bean Scope)
  • SpringAI_Chat模型_DeepSeek模型--基础对话
  • 扭蛋机系统开发:打造多元化娱乐生态的新引擎
  • Libevent(3)之使用教程(2)创建事件
  • Spring MVC @RequestParam注解全解析
  • 【Linux】重生之从零开始学习运维之Nginx之server小实践
  • 最新版vscode 连接ubuntu 18.04 保姆级教程
  • 编程实现Word自动排版:从理论到实践的全面指南
  • SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView
  • 【Android】ListView与RecyclerView的基础使用
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • C++实现单层时间轮
  • 4644电源管理芯片在微波射频组件中的技术优势与国产化实践
  • Linux驱动学习day24(UART子系统)
  • Ubuntu系统下快速体验iperf3工具(网络性能测试)
  • 嵌入式Linux:什么是线程?
  • 【RK3576】【Android14】开发环境搭建
  • Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】
  • 荷兰KIPP ZONEN CMP4 太阳辐射传感器耐热仪器设计高温日射计一种辐射计