温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Redis如何解决缓存穿透问题

发布时间:2025-12-27 04:46:51 来源:亿速云 阅读:129 作者:小樊 栏目:关系型数据库

Redis缓存穿透治理

问题定义与识别

  • 定义:指查询的键在缓存数据库中都不存在,导致请求每次都直达数据库,在高并发下容易压垮数据库。常见成因包括恶意构造不存在的key、业务删除或尚未生成的数据、以及系统设计未妥善处理空结果。识别要点:对特定key的访问量异常增高、缓存命中率骤降、数据库读压力异常上升,配合日志与监控(如Prometheus + Grafana观察命中率、未命中率、DB QPS)可快速定位。

核心解决方案

  • 布隆过滤器前置拦截:将所有“可能存在的key”预加载到布隆过滤器;请求先过过滤器,若返回“一定不存在”,直接拒绝,避免访问缓存与数据库;若“可能存在”,再走缓存/DB流程。优点是空间效率高、性能高;注意存在误判率且需维护(新增/删除数据时同步更新或重建)。
  • 缓存空对象(Null Value Caching):当数据库查询为空时,仍写入一个空标记(如空字符串或特殊对象)到缓存,并设定较短TTL(如30秒—2分钟),使后续相同请求在缓存层被拦截。优点是实现简单;缺点是会占用一定内存,且在数据被写入后可能出现短期不一致,可通过较短TTL缓解。
  • 互斥锁/分布式锁(Single Flight):缓存未命中时,只允许一个线程去数据库加载并回填缓存,其他线程等待后直接从缓存读取。常用实现如Redisson分布式锁。优点是有效降低穿透与并发打到DB;缺点是会降低吞吐、增加尾延迟。
  • 接口层校验与限流降级:在网关/接口层做参数合法性校验(如ID范围、格式)、热点参数限流黑白名单熔断降级,对异常来源快速失败,减轻后端压力。适合作为第一道屏障与其他方案组合使用。

组合方案与适用场景

场景 推荐组合 关键点
正常业务中存在少量不存在key 缓存空对象 + 接口校验/限流 空值TTL设短,既拦截重复查询又避免长期不一致
恶意/批量构造不存在key 布隆过滤器 + 缓存空对象 + 限流/黑名单 过滤器挡掉“一定不存在”的请求;空值兜底;限流/黑名单抑制攻击流量
高并发下缓存未命中并发回源 互斥锁 + 缓存空对象 避免“缓存击穿式”穿透,保证只有一个线程回源回填
数据写入后短期不一致不可接受 布隆过滤器 + 较短空值TTL + 主动失效/更新 缩短空值存活时间,结合事件/消息在写入后主动刷新或删除相关空值标记
上述组合可按业务容忍度与成本灵活取舍,通常建议至少启用布隆过滤器 + 空值缓存 + 限流中的两项以形成多层防线。

工程实践与注意事项

  • 布隆过滤器参数与维护:根据预期数据量合理设置容量与误判率,并在数据新增/删除时增量更新或定期重建;对“误判命中的少量请求”仍用空值缓存兜底。
  • 空值缓存的一致性与成本:空值TTL建议控制在30秒—2分钟;在数据被写入后可通过主动删除空值或设置更短TTL降低不一致窗口;对海量不存在key的攻击场景,空值缓存可能占用较多内存,应与限流/黑名单配合。
  • 监控与告警:持续监控缓存命中率、未命中率、DB QPS/延迟,对命中率异常下降、特定key突增访问、DB压力异常等设定告警,及时联动限流与排查。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI