在当前团队,有几十个微服务,每个服务又有几个节点,缓存层基于 JetCache,采用 LOCAL + Redis 两级架构。
系统大部分时候运行稳定。但每隔一段时间,就会遇到一类棘手的问题:
用户反馈设备详情页数据不一致——同一设备,隔几秒刷新就交替显示在线和离线状态,而设备的状态其实一直没变。先查 Redis,数据正常。再查数据库,也正常。
问题定位到某个 Pod 的本地缓存未失效,脏数据驻留在内存中。
此时需要确认该 Pod 上这个 key 的实际缓存值。但 JetCache 本身没有提供查询本地缓存内容的接口。
逐台登录服务器打日志?四个 Pod 就需要重复操作四次。拿到日志后,还要手动对比四份输出,才能找出数据异常的节点。如果部署了二十个 Pod,这个排查过程的时间成本难以接受。
JetCache 只管「怎么缓存」,不管「缓存里有什么」。排查基本靠猜。
这个问题困扰我已久。最终在工作之余,动手写了这个工具。
JXCache。GitHub:https://github.com/yibiner/JXCache
如果你也有在用 JetCache,点个 star 收藏下,万一后续用上了呢~
它解决什么问题
JXCache 不是另一个缓存框架。它是一层 Observer + Aggregator,架在已有 JetCache 的 Spring Boot 服务之上,提供缓存可视化、跨节点对比和缓存失效能力。
工作中最常遇到的三个场景:
场景一:需要确认某个缓存 key 在线上实际存储的值。 以往的做法是加日志、改代码、重新部署。现在一个 HTTP 请求即可获取完整 value。
场景二:多 Pod 部署时,同一个 key 在各节点上的值是否一致。 以往需要逐台登录服务器手动对比。现在一个聚合请求,各节点的值并列展示,不一致的直接高亮标记。
场景三:发现脏数据需要立即清除。 以往只能修改 TTL 等待过期,或重启服务。现在调用一个接口,指定 key,即时失效,支持单节点或全节点操作。

下面逐一说明实现思路。
Observer:单节点缓存可视化
Observer 是部署在每个业务服务上的观测端,本质是一组 REST 接口。
设计的核心原则:查看缓存内容,但不能因为观测行为本身而改变缓存状态。
这里有一个需要注意的问题。JetCache 的 MultiLevelCache 在读取时会触发回填机制——L0 未命中则查询 L1,L1 有值时自动写回 L0。如果通过 JetCache 的 API 读取缓存,恰好 L0 已过期,它会从 Redis 回填一条数据。此时你无法判断这条数据是原本就存在,还是被观测行为触发的回填。
因此 Observer 绕开了 JetCache 的代理层,直接读取 Caffeine 的内部数据结构。多了一些内省代码,但保证了观测的纯净性——查看缓存不会影响缓存。
三个核心接口:
列出缓存 key
支持前缀过滤、分页和分片。当缓存中存在大量 key 时,通过分片查询避免单次返回数据量过大。
查看单个 key 的完整值
不做截断处理,存储什么就返回什么。
失效某个 key
即时生效,无需等待 TTL 过期或重启服务。

Aggregator:跨节点聚合查询
单节点可视化的问题解决了,但真正棘手的场景是多节点对比。
我们平台单个服务通常部署四到六个 Pod。当缓存不一致时,只能确定「某个 Pod 存在问题」,但无法快速定位是哪一个。
Aggregator 的职责:通过注册中心发现目标服务的所有节点,将查询请求并发发送到每台机器,汇总结果后统一返回。
同一个 key 在四个节点上的值:
返回每个节点的值,各节点差异一目了然。
一致性检查更直接:
直接返回一致或不一致的判定。不一致时,列出每个节点的具体值。

跨节点失效同理。指定 key 和服务名,Aggregator 将失效请求广播到所有节点。
并发查询的工程细节
并发查询在实现层面有几个需要处理的问题:
慢节点不应阻塞整次查询。 四个 Pod 中有一个发生 GC 导致响应变慢,不能因此丢弃其他三个节点的结果。我为每个节点设置了独立超时(默认 2 秒),并设置了整体查询截止时间(默认 4 秒)。超时后返回已完成节点的部分结果,同时标记失败节点。
排查请求需与业务线程隔离。 使用固定线程池,排查流量与业务流量互不干扰。
避免 HTTP 连接频繁建立。 使用连接池管理,多节点高频查询时不会反复进行 TCP 三次握手。
以上参数均可按需调整:
注册中心
JXCache 支持不同的配置:
- Fixed:静态配置 IP:Port 列表。适用于本地调试和小规模固定部署,不依赖外部组件。
- Nacos:从 Nacos 服务发现拉取实例列表,带本地缓存。适用于生产环境。
两者可同时启用。Nacos 设置较高优先级(值越小越优先),Fixed 自动降级为兜底。即使 Nacos 不可用,Fixed 配置的 fallback 节点仍可保证排查链路畅通。
注册中心模块已做 SPI 化设计。方便后续扩展 Eureka、Consul 或 Kubernetes Endpoints。
Web UI:可视化管理界面
手动调用 REST 接口还是太麻烦,一个可视化操作页面是必不可少的。
Web UI 主要包含四个功能页面:
- 缓存列表:选择服务和缓存名称,分页浏览 key,支持前缀搜索
- 缓存详情:查看完整 value,支持一键失效操作
- 跨节点查询:输入 key,展示各节点的值及一致性判定结果
- 节点管理:查看目标服务的节点列表及健康状态

前端独立部署:
默认访问
http://localhost:5173。Observer 和 Aggregator 的后端地址分别通过环境变量指定。接入方式
接入很简单。
第一步:Observer
在业务服务中添加一个依赖:
配置一行:
至此接入完成。服务启动后可访问
/api/jxc/observer/* 接口。零侵入,不影响现有缓存逻辑。第二步:Aggregator(可选)
单实例部署时 Observer 已可满足需求。多实例部署才需要 Aggregator。
单独启动一个聚合服务,添加 Nacos Starter:
配置注册中心:
Observer 与 Aggregator 完全解耦。仅安装 Observer 即可进行单节点排查,加入 Aggregator 后可进行跨节点聚合查询。按需组合,无需全量部署。
最后
JXCache 是一个为了处理日常工作中反复遇到的 JetCache 问题的工具。
项目目前尚不完善。安全治理、Micrometer 指标接入、OpenAPI 文档、更多注册中心适配——这些都在 Roadmap 中,后续逐步补充。
如果对你有帮助,欢迎 Star ⭐。发现问题请提 Issue,有想法欢迎直接提交 PR。
- 作者:Yibin
- 链接:https://yibin.dev/article/39460b50-99a4-80e0-93d6-fa8c267c349d
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章






