缓存与 KV 存储Cache Penetration
缓存穿透 是什么?
查一个不存在的数据,每次都绕过缓存打到数据库
类比:有人拿假身份证天天来查档案,柜员每次都得翻一遍库房
为什么会发生
缓存只存「查到的」数据。查询 id=-1 这种不存在的 key,缓存永远不命中,请求全部落到数据库。正常业务里这是小概率,但被恶意刷接口时就是攻击手段。
三种解法
从便宜到彻底,按业务需要选。
- 空值缓存:查不到也写一个短 TTL 的空值(如 60 秒),挡住重复请求
- 布隆过滤器:把所有存在的 key 放进过滤器,不存在的直接拒绝,有极小误判率
- 参数校验:id ≤ 0、格式不对的请求在入口就拦掉
和击穿、雪崩的区别
穿透是「数据不存在」,击穿是「热点 key 失效」,雪崩是「大批 key 同时失效或实例挂掉」。三者现象都是数据库压力暴涨,但解法完全不同,别背混了。