缓存穿透的根因是数据不存在、未缓存空值、缺少前置过滤,与链表寻址等底层机制无关;多级缓存指L1本地缓存、L2分布式缓存、L3数据库的分层结构。
这个标题存在概念混淆,需要先厘清关键点。
“多级缓存”和“缓存穿透”是两个明确的技术概念,但“链表变量在复杂架构中的寻址”不属于缓存穿透的分析范畴,也不构成标准的多级缓存问题。
多级缓存指的是一套分层的数据访问结构,常见为:
- L1:进程内本地缓存(如 Caffeine),速度快、容量小、不共享;
- L2:分布式缓存(如 Redis),速度较慢、容量大、跨节点共享;
- (可选)L3:数据库本身或只读从库,作为最终数据源。
缓存穿透是指:
请求查询一个数据库中根本不存在的数据(例如非法 ID、已删除记录、恶意构造 key),导致每次请求都绕过所有缓存层,直击数据库。它本质是流量漏防问题,与数据结构(如链表)无关。
而“链表变量”“寻址”属于底层编程或内存模型层面的问题,常见于单机算法、嵌入式系统或特定中间件内部实现。在 Spring + Redis + Caffeine 这类主流多级缓存架构中,业务代码几乎不会直接操作链表变量,更不会因“链表寻址失败”引发缓存穿透。
所以,如果你实际遇到的是以下某类问题,建议对症排查:
疑似缓存穿透,但现象异常?
- 缓存命中率极低,数据库 QPS 突增,且日志中大量出现相同非法参数(如 id=-1、id=""、超长随机字符串); - 检查是否缺失基础参数校验,或未启用空值缓存 / 布隆过滤器; - 不是“找不到链表节点”,而是请求压根没走通缓存逻辑——应检查拦截顺序(如网关→布隆过滤器→缓存注解→DAO)。缓存数据不一致,怀疑是引用/对象复用导致?
- 例如:Caffeine 缓存了某个对象引用,后续修改该对象属性,导致其他线程读到脏数据; - 建议缓存前做深拷贝(尤其涉及可变集合、DTO、Map 等),或使用不可变对象; - 这属于缓存一致性风险,和穿透无关。性能瓶颈出现在缓存层,怀疑寻址开销大?
- Caffeine 内部使用分段哈希表(非链表主导),Redis 使用跳表+哈希表,二者查找均为 O(1) 或 O(log N),不依赖链表遍历; - 若实测 get 操作延迟高,优先查 GC、序列化耗时、网络抖动或锁竞争,而非“链表寻址”。本质上,缓存穿透的根因永远落在三处:
- 数据不存在(业务或攻击)
- 缓存未覆盖空结果(没存 null)
- 缺少前置过滤(如布隆过滤器、参数白名单)
跟链表、指针、内存地址这些底层机制没有因果关系。
不复杂但容易忽略。

















