JetCache 本地+远程缓存一致性完整指南
一、前置基础JetCache 多级缓存模型要理解一致性问题首先要明确 JetCacheBOTH模式的底层结构它是两级缓存组合MultiLevelCache并非单一存储L1本地缓存基于 Caffeine 或 LinkedHashMap存储在当前 JVM 堆内存中读写无需网络开销性能极高但仅对当前 JVM 实例可见。L2远程缓存基于 Redis存储在远端服务器是所有 JVM 实例共享的数据源读写需要网络 IO但能保证多节点间的数据基准一致。默认读写逻辑读优先查 L1 → L1 命中直接返回 → L1 未命中查 L2 → 回填 L1 后返回。写/删先操作 L2 → 再操作 L1保证共享数据源优先更新。二、核心总览不一致的本质与场景差异JetCache 的不一致问题不是框架 Bug而是分布式系统 CAP 理论的必然取舍不同部署场景的一致性级别完全不同部署场景一致性级别核心风险解决方案多节点集群最终一致Eventual Consistency跨 JVM 本地缓存无法感知变更、广播延迟/丢失开广播失效 短本地 TTL 核心场景弃用本地缓存单节点单机准强一致Quasi-Strong Consistency仅毫秒级瞬态窗口、配置错误TTL 倒挂严格遵守localExpire remoteExpire强一致场景库存/余额/价格不满足本地缓存副本导致脏读、并发操作原子性问题纯远程缓存 Lua 脚本 版本号校验三、多节点集群为什么必然存在不一致3.1 根本原因本地缓存是跨 JVM 的「数据孤岛」多节点部署时每个 JVM 都有自己的独立 L1 缓存彼此完全不可见请求打到节点 A触发Cacheduser:1张三写入 A 的 L1 RedisL2。后台更新操作路由到节点 A执行CacheInvalidateA 清空自己的 L1 更新 Redis 为user:1李四。用户再次访问请求被负载均衡到节点 BB 的 L1 仍存在user:1张三直接返回旧值。此时RedisL2是正确的但部分节点的 L1 是永久脏数据直到本地 TTL 过期。3.2 JetCache 的缓解方案Redis Pub/Sub 广播失效为解决跨节点失效问题JetCache 提供了syncLocal broadcastChannel机制当任意节点执行put/remove/update时除了操作 Redis还会通过Redis Pub/Sub发送一条缓存失效消息。集群内所有节点订阅该 Channel收到消息后立即删除本地对应 Key 的缓存。⚠️ 但该方案仍然是最终一致无法消除不一致窗口原因如下网络延迟消息从发送到接收存在几十~几百毫秒的延迟这段时间内其他节点仍会命中旧值。消息丢失风险Redis Pub/Sub 不保证消息持久化连接闪断、Redis 主从切换都会导致消息丢失如果自定义了 Redisson 编解码器如JsonJacksonCodec还会导致消息反序列化失败等于失效通知完全失效。消费延迟JVM 处理订阅消息需要排队高负载下可能出现秒级延迟。3.3 多节点下必踩的 5 个坑TTL 倒挂localExpire本地 TTLremoteExpireRedis TTL。Redis 数据过期后本地缓存成了无源之水永远无法更新直到本地 TTL 到期。Key 定义不一致Cached、CacheInvalidate、CacheUpdate的area/name/key不匹配比如 SpEL 表达式写法不同导致清了错误的 Key 或没清到。AOP 失效缓存注解用在 private 方法、同类方法内部调用、Async/Transactional异常传播场景导致注解未被 Spring AOP 拦截缓存未清理。广播配置遗漏未配置broadcastChannel或syncLocalfalse等于完全没开跨节点失效。非标准更新路径直接改 DB 不碰缓存、只改 Redis 不改 DB导致缓存与 DB 基准都不一致。四、单节点单机为什么基本一致单节点部署时最大的「跨 JVM 通信」障碍消失JetCache 可以在同一个 JVM 内完美协调 L1 和 L2 的操作不存在物理数据不一致。4.1 核心保障JVM 内的同步操作顺序JetCache 的所有缓存操作都是同步顺序执行没有并发隔离问题写操作先写 L2Redis→ 再写 L1本地保证共享数据源优先更新本地只是镜像。删操作先删 L2 → 再删 L1保证外部请求先无法读到旧值再清理内部副本。读操作先查 L1 → 未命中查 L2 → 回填 L1保证 L1 永远是 L2 的最新镜像。4.2 仅存的瞬态不一致场景可自愈不影响业务单节点下唯一可能出现的不一致是毫秒级瞬态窗口不会造成永久脏数据JVM 崩溃中断刚写完 L2、还没更新 L1 时服务宕机重启后 L1 随 JVM 销毁下次读取会从 L2 加载新值完全自愈。并发竞态线程 A 执行删除已删 L2 但未删 L1 时线程 B 抢先读了 L1 旧值仅持续毫秒级绝大多数业务可忽略。配置错误唯一人为风险localExpire remoteExpire导致 Redis 过期后本地仍返回旧值这是单节点下唯一会造成永久脏数据的情况严格遵守localExpire remoteExpire即可完全避免。五、强一致要求场景的定制方案核心新增如果业务是高并发库存扣减、实时价格/账户余额、权限信息等对脏读零容忍的场景默认的 BOTH 模式完全不满足要求必须定制方案5.1 场景一高并发库存扣减/优惠券核销特点并发极高、不允许超卖、不允许脏读性能和安全同等重要。❌ 禁用方案默认 BOTH 模式、本地缓存存库存值、非原子性更新。✅ 落地方案纯 REMOTE 模式 Lua 原子脚本 双删兜底弃用本地缓存缓存类型改为typeREMOTE所有读都走 Redis从根源上消除本地副本不一致问题。原子性扣减库存扣减必须用 Redis Lua 脚本保证「查询库存→校验库存→扣减库存」的原子性避免并发超卖-- 库存扣减Lua脚本KEYS[1]为库存keyARGV[1]为扣减数量if(redis.call(exists,KEYS[1])1)thenlocalstocktonumber(redis.call(get,KEYS[1]));if(stocktonumber(ARGV[1]))thenredis.call(decrby,KEYS[1],ARGV[1]);return1;-- 扣减成功endendreturn0;-- 库存不足分布式锁兜底Lua 脚本执行失败时用 Redisson 分布式锁串行化处理防止缓存击穿打爆 DB。写后双删更新库存时走「先更 DB → 再删 Redis → 延迟 1s 再删一次」的旁路模式应对并发读写导致的脏数据写回问题。5.2 场景二实时价格/账户余额/权限信息特点对数据准确性要求极高但读 QPS 也很大完全不用本地缓存会压垮 Redis。✅ 折中方案本地缓存 版本号校验 短 TTL缓存结构调整把缓存值改为{data: 实际业务数据, version: 递增版本号}版本号随数据更新单调递增。读流程① 先查本地 L1拿到{data, version}② 同步/异步查 Redis 中该 Key 的最新 version③ 若本地 version ≥ Redis version直接返回本地 data否则从 Redis 加载最新数据回填 L1。写流程① 更新 DB生成新 version② 更新 Redis 中的{data, newVersion}③ 开syncLocaltrue broadcastChannel广播清所有节点的 L1。兜底本地 TTL 设为 1~5s即使版本号校验失效最多 5s 后自动过期加载新值。✅ 增强方案把 version 单独存一个 Redis Key仅用来做一致性校验减少数据传输量。5.3 场景三普通低频配置/非核心数据特点允许秒级不一致读 QPS 高追求性价比。✅ 方案BOTH 模式 syncLocal 短 localExpire直接用 JetCache 默认多级缓存localExpire设为 1~5sremoteExpire设为 30~60s开广播失效即可无需额外开发。六、生产级配置与最佳实践6.1 完整 jetcache.yml 配置模板可直接抄jetcache:statIntervalMinutes:15# 统计间隔输出缓存命中率日志用于监控area:default:# -------------------------- 多节点集群通用配置 --------------------------type:both# 本地远程多级缓存local:type:caffeine# 本地缓存类型Caffeine性能最优limit:10000# 最大缓存条目数防止OOMexpireAfterWriteInMillis:2000# 本地TTL2秒远小于远程TTLsyncLocal:true# 开跨节点本地缓存失效remote:type:redis.lettuce# 推荐Lettuce响应式支持更好也可选redissonkeyConvertor:fastjson# 不要用自定义编解码器避免广播消息反序列化失败expireAfterWriteInMillis:30000# 远程TTL30秒broadcastChannel:jetcache_invalidate_channel# 广播失效通道必须配# Redis连接配置host:127.0.0.1port:6379password:database:0poolConfig:minIdle:5maxTotal:20# -------------------------- 强一致场景库存/余额配置 --------------------------# type: remote # 只用远程缓存完全禁用本地缓存# remote:# type: redis.lettuce# keyConvertor: fastjson# expireAfterWriteInMillis: 30000# # 强一致场景不需要广播配置因为根本没有本地缓存6.2 注解使用规范避免 90% 的坑Cached、CacheInvalidate、CacheUpdate必须使用相同的area、name、key定义Key 的 SpEL 表达式要完全一致避免清错 Key。注解只能用在public 方法上且不能通过同类方法内部调用Spring AOP 生效要求不要在Async、Transactional自定义超时/传播行为的方法上使用缓存注解避免事务未提交就清缓存。高并发读场景加CachePenetrationProtect防止缓存击穿多个线程同时请求同一个 Key 时只有一个线程去加载 DB其余线程阻塞等待。更新数据严格走「先更 DB后清缓存」的标准旁路模式禁止「先清缓存再更 DB」避免并发下脏数据写回。6.3 TTL 配置铁律永远保证localExpire remoteExpire本地 TTL 就是愿意容忍的最大不一致窗口。强一致场景localExpire 设为 1~5s非核心场景最多不超过 10s。remoteExpire 根据业务更新频率设置核心数据 30~60s静态数据如类目可设 10~30min。七、兜底与监控监控缓存命中率JetCache 每statIntervalMinutes输出命中率日志若本地命中率过高但远程命中率低说明广播失效或 Key 定义不一致需排查。定时一致性校验非核心数据可开定时任务随机抽查本地缓存和 Redis 的值是否一致不一致则主动清本地缓存。降级预案Redis 故障时本地缓存可临时作为只读缓存但要关闭写操作避免脏数据扩散Redis 恢复后清空所有本地缓存重新加载。异常告警监控 broadcastChannel 的消息发送/接收成功率低于 99.9% 触发告警排查 Redis 连接或编解码器问题。八、最终总结JetCache 的 BOTH 模式是「性能优先、最终一致」的设计天生不适合库存、余额等强一致场景不要强行使用。多节点集群的不一致是分布式系统的必然结果只能通过缩短 TTL、开广播来降低影响无法完全消除。单节点单机的不一致是可忽略的瞬态问题只要配置正确就不会有永久脏数据。强一致场景必须放弃本地缓存或用版本号校验兜底核心操作要靠 Redis Lua/分布式锁保证原子性。

相关新闻

霍普金斯大学与StepFun联手,打造能真正“看懂“图片的AI评估标准

霍普金斯大学与StepFun联手,打造能真正“看懂“图片的AI评估标准

这项由约翰斯霍普金斯大学、清华大学与StepFun(阶跃星辰)联合完成的研究,发表于2026年第43届国际机器学习大会(ICML 2026),会议地点为韩国首尔,论文收录于PMLR第306卷。感兴趣的读者可通过论文编…

2026/7/10 1:40:00 阅读更多 →
运算放大器测温电路Multisim仿真问题解析与工程实践

运算放大器测温电路Multisim仿真问题解析与工程实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在整理模拟电子技术课设资料时,发现很多同学在运算放大器测温电路仿真中遇到了一个典型问题:电路图看起来…

2026/7/10 1:38:00 阅读更多 →
3种电压转电流电路方案对比:运放+三极管 vs 集成芯片 vs Howland电流泵

3种电压转电流电路方案对比:运放+三极管 vs 集成芯片 vs Howland电流泵

电压转电流电路三大架构深度评测:从分立元件到集成方案的技术抉择 1. 电压转电流电路的核心价值与设计挑战 在工业自动化、仪器仪表和传感器系统中,电压到电流的转换(V/I转换)扮演着关键角色。这种转换的本质是创建一个压控电流源…

2026/7/10 1:38:00 阅读更多 →

最新新闻

应用密码学中的ASCII:从字符编码到加密基石

应用密码学中的ASCII:从字符编码到加密基石

引言在应用密码学的世界里,我们谈论的是如何保护信息的机密性、完整性和真实性。但一个最基础却容易被忽视的问题是:信息在计算机中究竟是以什么形式存在的?答案就是二进制。计算机底层硬件只能识别0和1两个数字,而我们日常使用的…

2026/7/10 2:26:10 阅读更多 →
PS2遥控小车硬件选型对比:L298N vs HW-166 驱动模块在12V/5V系统下的3项关键测试

PS2遥控小车硬件选型对比:L298N vs HW-166 驱动模块在12V/5V系统下的3项关键测试

PS2遥控小车硬件选型深度评测:L298N与HW-166驱动模块的12V/5V系统实战对比在STM32遥控小车项目中,电机驱动模块的选型直接影响着小车的动力性能、续航时间和控制精度。面对市场上众多的驱动模块选项,L298N和HW-166是最常见的两种选择。本文将…

2026/7/10 2:26:10 阅读更多 →
计算机大数据毕设实战-基于 Django 的音乐点播数据可视化管理系统的设计与实现 基于 Django 的热门音乐榜单挖掘分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机大数据毕设实战-基于 Django 的音乐点播数据可视化管理系统的设计与实现 基于 Django 的热门音乐榜单挖掘分析系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/10 2:22:09 阅读更多 →
AI赋能数据治理:从元数据管理到质量管控的实战路径

AI赋能数据治理:从元数据管理到质量管控的实战路径

1. 项目概述:当数据治理遇上AI,一场效率革命数据治理,这个听起来有点“古板”和“流程化”的领域,正在被AI技术悄然重塑。过去,我们谈数据治理,脑海里浮现的往往是成堆的文档、复杂的血缘关系图、永无止境的…

2026/7/10 2:22:09 阅读更多 →
千万别乱译!日本护照翻译正确办理方式、收费及避坑大全

千万别乱译!日本护照翻译正确办理方式、收费及避坑大全

内容摘要:日本护照翻译可可通过线上正规小程序办理,只需上传护照材料,填写需求、在线缴费,完成后即可获取电子翻译件,需要纸质版可直接邮寄到家。线下需前往实体翻译门店现场办理,翻译完成可再次前往店铺领…

2026/7/10 2:18:08 阅读更多 →
AI函数调用:Function Calling从理论到实战全解析

AI函数调用:Function Calling从理论到实战全解析

📌 前言 随着大语言模型(LLM)的快速发展,我们发现纯文本对话模式下的 AI 存在明显的能力边界:它不知道今天的天气、查不到实时股价、算不出复杂的数学公式、更操作不了你电脑上的文件。 Function Calling&#xff08…

2026/7/10 2:18:08 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻