☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当系统使用缓存层(如 Redis)加速数据读取时,若大量请求查询数据库中根本不存在的键(例如恶意构造的非法 ID),这些请求将绕过缓存直接打到后端数据库,造成数据库压力激增甚至宕机,这种现象即为缓存穿透。以下是实现防止缓存穿透的多种健壮代码方案:
一、空值缓存(Null Cache)
该方法通过将查询结果为空的键也写入缓存,并设置较短的过期时间,使后续相同请求直接命中缓存,避免反复穿透至数据库。
1、在业务逻辑中执行数据库查询前,先尝试从 Redis 获取对应 key 的值。
2、若 Redis 返回 null 或空对象,则继续查询数据库。
3、若数据库查询结果为 null,则向 Redis 写入一个特殊占位符(如字符串 "NULL")并设置 TTL(例如 5 分钟)。
4、若数据库返回有效数据,则正常写入缓存并设置合理过期时间。
5、在读取缓存时,若命中值为 "NULL",则直接返回空响应,不再访问数据库。
二、布隆过滤器(Bloom Filter)预检
布隆过滤器是一种空间效率极高的概率型数据结构,可快速判断某个元素“一定不存在”或“可能存在”。将其部署在缓存之前,能拦截绝大多数非法查询请求。
1、在服务启动时,将所有合法主键(如商品 ID、用户 ID)批量加载进布隆过滤器。
2、每次请求到达时,先用请求中的 key 查询布隆过滤器。
3、若布隆过滤器返回 “不存在”,则直接返回空响应,不进行缓存与数据库查询。
4、若布隆过滤器返回“可能存在”,则继续走缓存 → 数据库流程。
5、注意定期更新布隆过滤器,以应对新增数据;更新时采用 异步重建+原子切换 策略,避免过滤器失效窗口。
三、参数合法性校验与规则拦截
在请求进入缓存/数据库之前,对输入参数进行强约束校验,从源头杜绝非法键的生成与传播,属于前置防御机制。
CodeGeeX 2.21.0是智谱AI推出的AI编程助手版本,对Inline Chat功能进行了重大优化,包括UI设计升级、支持流式输出以提升响应速度,并新增“查看思路”按钮以便理解代码原理。同时,该版本在编辑器中新增CodeLens控件,支持一键“解释”代码或“添加注释”。目前该工具对个人开发者免费开放。
1、定义每个业务场景下 key 的格式规范(如用户 ID 必须为 8–16 位数字,商品 SKU 必须匹配正则 ^SKU[0-9]{6,12}$)。
2、在 Controller 或 Gateway 层解析请求参数后,立即执行格式校验。
3、若校验失败,则直接返回 HTTP 400 错误,并记录 非法参数日志 供安全审计。
4、对高频异常参数(如连续出现 10 次以上非数字用户 ID)触发限流或 IP 封禁策略。
四、缓存雪崩协同防护(联动配置)
缓存穿透常与缓存雪崩并发发生,因此需统一管理缓存失效策略,避免空值缓存集中过期导致二次穿透。
1、为空值缓存设置随机 TTL 偏移量,例如基础 300 秒 + 随机 0–60 秒。
2、对同一类业务 key 使用统一命名空间前缀(如 user:notexist:),便于批量清理或监控。
3、在 Redis 中为所有空值 key 设置 EXPIREAT 时间戳而非 EXPIRE,确保集群时钟一致下精准控制过期。
4、通过 Redis 的 KEYS user:notexist:* 命令定期统计空值缓存占比,超过阈值(如 15%)时告警并触发布隆过滤器重载。
五、接口级熔断与降级兜底
当检测到某类 key 的穿透请求速率突增时,启用实时熔断机制,切断无效请求链路,保障核心路径可用性。
1、基于 Sentinel 或 Resilience4j 配置每秒请求数(QPS)阈值,按 key pattern(如 user:id:*)维度统计。
2、当某 pattern 的空值响应 QPS 超过阈值(如 100/s),自动开启熔断开关。
3、熔断开启后,对该 pattern 所有请求直接返回 预设降级 JSON(如 {"code":200,"data":null,"msg":"暂不可用"})。
4、熔断持续时间为 60 秒,结束后自动半开探测,仅放行 1 个请求验证数据库是否恢复。










