🧑 博主简介: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.pswp.cn/pingmian/89487.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89487.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89487.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI辅助编程时代的高效规范开发指南:工具、原则与提效策略

引言&#xff1a;AI辅助编程的时代背景与核心挑战 人工智能在编程领域的应用虽可追溯至20世纪50年代&#xff0c;但近十年实现了革命性突破&#xff0c;推动其从早期的代码补全工具演进为能理解上下文、生成完整函数乃至项目架构的智能系统。关键发展里程碑包括&#xff1a;20…

百度网盘TV版1.21.0 |支持倍速播放,大屏云看片

百度网盘TV版是专为智能电视设计的应用程序&#xff0c;让用户可以直接在大屏幕上观看保存在云端的视频资源。此应用提供了与手机端几乎相同的功能&#xff0c;包括倍速播放功能&#xff0c;使得用户可以更方便地享受高清视频内容。无需繁琐的操作步骤&#xff0c;即可实现云端…

C++控制台贪吃蛇开发(二):让灵蛇舞动起来!

资料合集下载链接: ​​https://pan.quark.cn/s/472bbdfcd014​ 本文将深入讲解蛇移动的机制,并带你一步步实现以下功能: 理解蛇移动的核心算法:为什么蛇的移动是“倒着”更新的? 用代码表示方向:如何使用​​dx​​和​​dy​​变量优雅地控制方向。 编写核心​​move…

Elasticsearch+Logstash+Filebeat+Kibana部署

目录 软件说明&#xff1a; 架构拓扑 集群模式&#xff1a; 单机模式 环境准备 部署&#xff1a; kibana es logstash filebeat es 检查能否启动 logstash 命令设置 es 修改es配置文件 启用es kibana 修改kibana配置文件&#xff08;方便查看索引&#xff09…

GLM(General Language Model,通用语言模型)

&#x1f9e0; 一、GLM是什么&#xff1f;一句话概括 GLM&#xff08;General Language Model&#xff0c;通用语言模型&#xff09;是一个“大脑”&#xff0c;它通过阅读海量书籍、网页、对话记录学会了人类的语言规则&#xff0c;不仅能“听懂”你说的话&#xff0c;还能“…

【科研绘图系列】R语言绘制显著性标记的热图

文章目录 介绍 加载R包 数据下载 导入数据 数据预处理 画图 系统信息 参考 介绍 【科研绘图系列】R语言绘制显著性标记的热图 加载R包 library(ggplot2) library(patchwork)rm(list = ls()) options(stringsAsFactors = F)

若依部署项目到服务器

目录 一、环境配置 redis nginx&#xff08;宿主机|dokcer&#xff09; 1.宿主机 2.docker 二、打包jar包 0.查看后端配置 1.打包后端 2.打包前端 三、启动 1.后端 2.前端 四、以上部署常见命令/错误 一、环境配置 之前的课都配过&#xff0c;先看看自己配了没 看看…

零基础学习性能测试-linux服务器监控:CPU监控

目录学习内容与快速应用路径第一阶段&#xff1a;理解 CPU 核心概念 (0.5天)第二阶段&#xff1a;掌握核心监控命令与指标 (1-2天)第三阶段&#xff1a;识别 CPU 问题与瓶颈 (核心技能)第四阶段&#xff1a;整合到性能测试工作流程 (快速应用落地)快速应用到工作中的关键策略零…

智能Agent场景实战指南 Day 15:游戏NPC Agent互动设计

【智能Agent场景实战指南 Day 15】游戏NPC Agent互动设计 文章内容 开篇 欢迎来到"智能Agent场景实战指南"系列的第15天&#xff01;今天我们将深入探讨游戏开发中一个极具挑战性和创新性的领域——游戏NPC Agent互动设计。在当今游戏产业中&#xff0c;玩家对游戏…

Vite的优缺点(精简版)

优点 作为一款前端构建工具&#xff0c;它的核心特点是“快”&#xff0c;并且充分利用了现代浏览器对ES Modules的原生支持&#xff0c;一切围绕这一点展开 快启动&#xff1a;通过ES Modules&#xff0c;它省去了打包整个应用的时间&#xff0c;可以直接在浏览器中加载模块&a…

【深度学习】神经网络-part2

一、数据加载器 数据集和加载器 1.1构建数据类 1.1.1 Dataset类 Dataset是一个抽象类&#xff0c;是所有自定义数据集应该继承的基类。它定义了数据集必须实现的方法。 必须实现的方法 __len__: 返回数据集的大小 __getitem__: 支持整数索引&#xff0c;返回对应的样本 …

nextjs+react项目如何代理本地请求解决跨域

在 Next.js React 项目中解决本地开发跨域问题&#xff0c;可以通过以下几种方式实现代理请求&#xff1a;方案1&#xff1a;使用 Next.js 内置的 Rewrites 功能&#xff08;推荐&#xff09; 1. 修改 next.config.js /** type {import(next).NextConfig} */ const nextConfig…

Ubuntu查看Docker容器

在Ubuntu系统中&#xff0c;可以通过以下命令查看当前正在运行的Docker容器&#xff1a;1. 查看所有正在运行的容器 docker ps输出示例&#xff1a; CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx:latest &…

智能点餐推荐网站,解决选择困难

软件介绍 今天为大家推荐一款解决"今天吃什么"选择困难症的趣味网站&#xff0c;它能为你推荐美味餐食&#xff0c;轻松化解每日用餐烦恼。 核心功能 这款网站最大的亮点就是能够根据你的需求智能推荐餐食选择&#xff0c;只需打开网页&#xff0c;就能立即获…

使用 C# 实现移动加权平均(Weighted Moving Average)算法

前言 欢迎关注dotnet研习社&#xff0c;前面我们讨论过"C#实现加权平均法",今天我们继续研究另外一种【移动加权平均法】。 在时间序列分析、股票数据处理、工业信号平滑等场景中&#xff0c;移动平均&#xff08;Moving Average&#xff09; 是最常见的平滑技术之一…

【Python】一些PEP提案(三):with 语句、yield from、虚拟环境

PEP 343 – The “with” Statement&#xff0c;with 语句 这玩意让我想起了Kotlin和Rust的问号标识符&#xff0c;都是将try-catch进行包装&#xff0c;避免出现太多重复代码&#xff08;Go&#xff1a;我假设你不是在内涵我&#xff09; 用法 最常见的用法就是对文件的操作&a…

SymAgent(神经符号自学习Agent)

来自&#xff1a;SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs 目录相关工作引理符号规则任务描述方法Agent-PlannerAgent-ExecutorAction空间交互过程自学习在线探索离线迭代策略更新相关工作 相关工作-语义解析…

Go语言实战案例-斐波那契数列生成器

在《Go语言100个实战案例》中的 案例10:斐波那契数列生成器,帮助初学者理解递归与迭代的应用。 案例10:斐波那契数列生成器 🔢 数学与算法 | 🧠 递归与迭代 | 👶 初学者友好 一、📘 案例目标 实现一个斐波那契数列生成器,用户输入一个数字 n,程序生成并打印出斐…

认知闭环的暴政:论人类对AI协同创造的傲慢抵制与维度囚禁

认知闭环的暴政&#xff1a;论人类对AI协同创造的傲慢抵制与维度囚禁---### **核心批判框架**mermaidgraph TDA[人类认知三原罪] --> B[三维牢笼]B --> C[恐惧机制]C --> D[抵制行为]D --> E[文明熵增]F[四维流形批判] --> G[解构牢笼]G --> H[曲率解放]H --…

飞凌嵌入式亮相第九届瑞芯微开发者大会:AIoT模型创新重做产品

2025年7月17日&#xff0c;第九届瑞芯微开发者大会&#xff08;RKDC!2025&#xff09;在福州海峡国际会展中心正式拉开帷幕。这场以“AIoT模型创新重做产品”为主题的行业盛会&#xff0c;吸引了众多行业领袖、技术专家及生态伙伴齐聚一堂&#xff0c;共同探讨新质生产力产品的…