Redisson RLocalCachedMap 核心参数详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea
Redisson RLocalCachedMap 核心参数详解
RLocalCachedMap 简介
RLocalCachedMap 是 Redisson 框架中的核心分布式数据结构,专为高性能分布式系统设计。它在传统分布式缓存的基础上实现了革命性的突破——将 本地内存的速度优势 与 Redis 分布式存储的一致性保障 完美融合。
在分布式集群环境中,频繁访问 Redis 会导致网络延迟成为瓶颈。RLocalCachedMap 通过在每个 JVM 实例本地维护热数据副本,使读取操作直接命中本地内存(微秒级响应),相比远程 Redis 访问(毫秒级)性能提升 1-2 个数量级。同时,它通过智能的 Pub/Sub 同步机制(支持 INVALIDATE
或 UPDATE
策略),确保集群内任一节点修改数据时,所有实例的本地缓存实时失效或更新,从而在接近本地速度的体验下,提供了强一致性保证。
其核心价值在于解决分布式系统的 "速度与一致性"悖论:
- 对读密集型场景(如商品详情、用户会话):通过本地缓存扛住超高 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
包装缓存值对象(键可能用WeakReference
或SoftReference
)。 - 行为: 只要发生 GC,无论内存是否充足,垃圾回收器立即回收仅被
WeakReference
引用的对象。缓存值对象生命周期极短。 - 适用场景: 存储临时数据或对内存极度敏感、可接受低命中率的场景(如临时会话数据)。缓存非常短暂。
- 淘汰原则: 比
- 作用: 决定当本地缓存达到
3. 写入模式 (Write Mode)
writeMode
(WriteMode 枚举)- 作用: 控制通过
RLocalCachedMap
写入数据时如何与MapWriter
(用于持久化到外部存储,如数据库)交互。 - 模式详解:
WRITE_BEHIND
(异步写后):- 行为: 对 Map 的写入操作先成功写入本地缓存和 Redis,然后异步调用
MapWriter
写入外部存储。 - 优点: 写入延迟低,性能高。
- 缺点: 存在数据丢失风险(外部存储写入成功前应用崩溃);外部存储写入顺序无法严格保证。
- 调优: 配合
writeBehindDelay
和writeBehindBatchSize
使用。
- 行为: 对 Map 的写入操作先成功写入本地缓存和 Redis,然后异步调用
WRITE_THROUGH
(同步直写):- 行为: 对 Map 的写入操作同步调用
MapWriter
写入外部存储。只有MapWriter
写入成功后,操作才被视为成功,数据写入本地缓存和 Redis。 - 优点: 保证本地缓存/Redis 与外部存储的强一致性;写入外部存储的顺序有保证。
- 缺点: 写入延迟较高(受外部存储性能影响)。
- 错误处理: 如果
MapWriter
抛出异常,该异常会直接抛给 Map 操作调用方,数据不会写入本地缓存和 Redis。
- 行为: 对 Map 的写入操作同步调用
- 作用: 控制通过
4. 存储模式 (Store Mode)
-
storeMode
(StoreMode 枚举)- 作用: 定义数据存储的位置和同步范围。
- 模式详解:
LOCALCACHE
(仅本地缓存):- 行为: 数据仅保存在当前 JVM 实例的本地内存中。不写入 Redis,不支持集群内其他实例的数据同步。
- 特点: 速度最快,无网络开销。
- 缺点: 数据非持久化;实例重启数据丢失;无法跨实例共享;无分布式一致性保证。
- 适用场景: 纯本地缓存需求,数据不重要或可重建,无需集群共享(如单机应用的临时计算缓存)。
LOCALCACHE_REDIS
(本地缓存 + Redis, 默认):- 行为: 数据同时写入当前 JVM 的本地内存和 Redis 集群。支持通过 Pub/Sub 机制(
syncStrategy
)在集群实例间同步缓存变更。 - 特点: 本地读取速度快;数据持久化在 Redis;支持分布式共享;通过
syncStrategy
提供一定一致性保证。 - 适用场景: 推荐模式。需要本地高速读取 + 分布式数据共享/一致性 + 持久化的场景(如集群部署的共享配置、热点数据缓存)。
- 行为: 数据同时写入当前 JVM 的本地内存和 Redis 集群。支持通过 Pub/Sub 机制(
-
storeCacheMiss
(boolean)- 作用: 控制是否缓存“键不存在”的结果。
- 行为:
false
(默认): 查询一个本地缓存和 Redis 中都不存在的键时,每次请求都会穿透到 Redis 查询,造成重复网络开销。true
(推荐开启): 首次查询不存在的键时,在本地缓存中存储一个特殊标记(如 Null 值)。后续对该键的请求直接在本地缓存命中此标记,返回“不存在”,避免重复穿透 Redis。
- 优点: 显著降低对不存在键的重复查询开销,提升性能(尤其防缓存穿透攻击)。
- 注意: 需要配合合适的
timeToLive
或evictionPolicy
清理这些“不存在”标记。
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
共同控制批处理行为。
- 作用: 仅在
总结与配置建议
- 基础配置 (
storeMode
,cacheSize
,evictionPolicy
,timeToLive
): 根据数据特性(大小、重要性、更新频率)和内存限制设定。LOCALCACHE_REDIS
+LRU
+ 合理cacheSize
/timeToLive
是通用起点。storeCacheMiss=true
强烈推荐开启以优化不存在键的查询。 - 一致性策略 (
syncStrategy
): 在带宽(INVALIDATE
)与读性能(UPDATE
)间权衡。高频读低频写选INVALIDATE
;高频写高频读且强一致选UPDATE
。 - 持久化模式 (
writeMode
): 需要额外持久化到 DB 时选择。追求性能选WRITE_BEHIND
(配合调优writeBehind*
参数);追求强一致选WRITE_THROUGH
。 - 容错 (
writeRetry*
): 网络环境不稳定时适当增加重试次数和间隔。 - 监控与调优: 密切监控本地缓存大小、命中率、网络带宽(尤其
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
能在分布式系统中有效平衡性能、内存消耗、数据一致性和可靠性。