接口明明设置了缓存,数据库却仍然持续出现大量查询,常见原因并不是缓存失效,而是请求参数对应的数据根本不存在。此类请求反复绕过缓存,形成缓存穿透。要做好缓存穿透防护,应先确认流量特征,再按风险逐层配置,而不是一开始就堆叠组件。
一、先做监控:确认问题是否真的来自穿透
第一步不是改代码,而是建立可以区分“正常未命中”和“恶意或异常未命中”的指标。建议在网关、应用服务和数据库连接层分别记录以下数据:
- 缓存命中率、未命中率,以及未命中后访问数据库的比例;
- 相同接口在一分钟内收到的不同参数数量;
- HTTP 400、404、429 和 5xx 响应的变化趋势;
- 数据库查询耗时、连接池占用和慢查询数量。
Prometheus 可用于采集指标,Grafana 可按接口、状态码和参数类型展示趋势。若未命中率升高但数据库查询没有同步增加,可能只是正常的首次访问;若大量不同参数都触发数据库查询,就应优先进入缓存穿透防护流程。
二、参数校验:用最低成本拦住无效请求
参数校验适合放在网关或业务服务最前面,优点是响应快、不会占用缓存和数据库资源。以内容详情接口为例,可以按以下步骤配置:
- 确认参数是否存在,并限制字符串长度;
- 按照业务规则校验类型、字符集和取值范围;
- 拒绝明显异常的编码格式,统一返回 400;
- 对同一接口使用一致的错误结构,避免客户端反复重试不同格式。
这一步无法识别所有不存在但格式正确的编号,因此不能单独承担完整的缓存穿透防护。它更适合处理拼接错误、空参数、超长输入和脚本化试探请求。
三、空值缓存:处理少量、重复的不存在数据
当参数格式合法,但查询结果确实为空时,可以把“空结果”写入缓存,并设置较短的过期时间。常见范围是几十秒到几分钟,具体取值要结合数据新增速度、访问量和缓存容量调整。

配置要点
- 空值缓存必须使用独立标记,区分“没有缓存”和“缓存结果为空”;
- 过期时间应明显短于正常数据,避免新数据生成后仍长期返回空结果;
- 限制空值缓存的总量,防止攻击者制造大量不同键;
- 对批量查询设置单次数量上限。
空值缓存适合热点不存在请求,例如某个刚下线的页面仍被频繁访问。它的优点是改造简单,缺点是无法阻止第一次请求到达数据库,也不适合参数空间极大的随机请求。
四、布隆过滤器:在访问缓存前判断键是否可能存在
布隆过滤器适合数据规模较大、有效键集合相对稳定的系统。应用先根据过滤器判断目标键是否“可能存在”:如果结果为不存在,可以直接返回;如果结果为可能存在,再查询缓存和数据库。
需要注意,布隆过滤器可能出现误判为存在,但正常设计下不会把真实存在的键误判为不存在。配置时应在全量数据导入、数据新增和数据删除三个环节保持同步,并预留容量。数据持续增长却不扩容,误判率可能上升。与空值缓存相比,布隆过滤器更适合拦截大量随机参数,但维护成本和发布流程更复杂。
五、限流与降级:阻止异常流量拖垮后端
当异常请求已经形成流量峰值,应在网关或服务入口增加限流。可以按客户端地址、接口、用户标识和请求特征组合设置规则,但不要只依赖单一来源标识,因为代理、移动网络和共享出口可能造成误伤。
- 先为正常业务保留基础并发量;
- 对短时间内连续触发无效查询的请求返回 429;
- 数据库连接池接近上限时,优先返回明确的稍后重试提示;
- 记录被限流请求的接口和规则命中情况,便于调整阈值。
如果业务需要稳定的公网接入、监控链路和流量调度,可将云主机、专线或网络托管作为整体环境评估,德讯电讯适合需要统一咨询网络资源与运维支持的团队;具体方案仍应根据地域、带宽、合规要求和现有架构确认。
五项配置如何选择
| 步骤 | 主要作用 | 适用条件 | 局限 |
|---|---|---|---|
| 监控 | 识别未命中与后端压力 | 所有系统都应配置 | 不能直接拦截请求 |
| 参数校验 | 拒绝明显无效输入 | 格式规则明确的接口 | 拦不住合法但不存在的键 |
| 空值缓存 | 减少重复空查询 | 少量重复的不存在数据 | 可能占用缓存空间 |
| 布隆过滤器 | 提前过滤大批随机键 | 有效键集合较稳定 | 需要维护同步和容量 |
| 限流降级 | 控制异常流量影响 | 突发访问或攻击场景 | 阈值过低会误伤正常用户 |
常见问题
缓存穿透和缓存击穿有什么区别?
缓存穿透针对的是大量不存在的数据;缓存击穿通常指某个热点数据失效后,大量请求同时查询后端。
是否必须同时使用五项配置?
不必。低流量接口可先配置监控、参数校验和空值缓存;键空间大且异常请求明显时,再增加布隆过滤器和限流。
空值缓存设置多久合适?
通常从几十秒到几分钟开始观察,数据变化频繁时取短一些,数据更新稳定且重复访问明显时可适当延长。
如何判断防护是否生效?
观察无效请求的数据库到达率、缓存命中率、429 比例和连接池占用。防护生效后,异常参数增加不应同步带来数据库查询量增长。
总体来看,缓存穿透防护应遵循“先识别、再过滤、后保护后端”的顺序。监控负责发现问题,校验和过滤负责减少无效请求,空值缓存负责处理重复空结果,限流降级则为数据库保留安全空间。


