当前位置: 首页 > news >正文

Redis 缓存三大经典问题:穿透击穿雪崩的本质区别与工程实践

在高并发场景下,缓存是保护数据库的第一道防线。但缓存本身也有几个经典的失效场景,如果不处理好,缓存非但帮不了忙,反而会让系统雪上加霜。

缓存穿透:查不存在的数据

缓存穿透是指查询一个一定不存在的数据。由于缓存不命中(缓存里没有这个 key),请求直接打到数据库。如果有人恶意用大量不存在的 ID 发请求,数据库会被瞬间打垮。

典型场景:攻击者用 id=-1 或者随机 UUID 疯狂请求用户接口。

解决方案:

  1. 布隆过滤器:在缓存前面加一层布隆过滤器,把所有合法 key 提前写入。查询前先过布隆过滤器,不存在的 key 直接拦截。
  2. 空值缓存:查数据库返回 null 时,也把这个 null 结果缓存起来(设一个较短的 TTL,比如 30 秒),下次同样的查询直接返回缓存的 null。
def get_user(user_id):cache_key = f"user:{user_id}"cached = redis.get(cache_key)if cached is not None:return None if cached == "NULL" else json.loads(cached)user = db.query_user(user_id)if user is None:redis.setex(cache_key, 30, "NULL")  # 缓存空值 30 秒else:redis.setex(cache_key, 3600, json.dumps(user))return user

缓存击穿:热点 key 过期

缓存击穿是指一个热点 key 在过期的瞬间,大量并发请求同时到来,全部穿透到数据库。和穿透的区别是:击穿是 key 本来存在但刚好过期了。

典型场景:某个商品做秒杀活动,缓存的商品详情刚好到期,几千个请求同时查数据库。

解决方案:

  1. 互斥锁:第一个请求发现缓存过期后,先获取一个分布式锁,只让一个请求去查数据库并更新缓存,其他请求等待。
  2. 永不过期 + 后台续期:热点数据不设过期时间,用后台线程定时续期更新。逻辑上有过期时间,但物理上不让 Redis 自动删除。
def get_product_with_lock(product_id):cache_key = f"product:{product_id}"lock_key = f"lock:{cache_key}"cached = redis.get(cache_key)if cached:return json.loads(cached)if redis.setnx(lock_key, 1):redis.expire(lock_key, 5)try:product = db.query_product(product_id)redis.setex(cache_key, 3600, json.dumps(product))return productfinally:redis.delete(lock_key)else:time.sleep(0.1)return get_product_with_lock(product_id)

缓存雪崩:大面积同时过期

缓存雪崩是指大量 key 在同一时间过期,导致所有请求瞬间涌入数据库。和击穿的区别是:击穿是一个 key,雪崩是一大批 key。

典型场景:系统启动时批量预热缓存,所有 key 设了相同的 TTL,到期时间一样。

解决方案:

  1. TTL 加随机值:给每个 key 的过期时间加一个随机偏移(比如 ±300 秒),避免同时过期。
  2. 多级缓存:本地缓存(如 Caffeine)+ Redis 两级缓存。即使 Redis 大面积过期,本地缓存还能挡住一部分请求。
  3. 熔断降级:当检测到数据库 QPS 突增,自动熔断返回兜底数据或错误提示,保护数据库不被打死。

总结

类型 原因 核心区别 推荐方案
穿透 查不存在的数据 key 从来不存在 布隆过滤器 + 空值缓存
击穿 热点 key 过期 单个 key,高并发 互斥锁 + 永不过期
雪崩 大批 key 同时过期 大面积同时失效 TTL 随机化 + 多级缓存

这三个问题看起来类似但本质不同,解决方案也完全不同。实际项目中它们可能同时出现,所以最好的做法是三层都加防护:布隆过滤器在最前面拦截无效请求,互斥锁保护热点 key,TTL 随机化防止批量过期。

http://www.jsqmd.com/news/650300/

相关文章:

  • Hunyuan-MT Pro法律科技实践:合同关键条款高亮+双语对照+风险提示
  • auc代码手撕
  • Ubuntu 20.04 LTS 安装NVIDIA驱动,手把手教你搞定那个烦人的蓝色MOK管理界面
  • Driver Store Explorer完整指南:Windows驱动存储区管理神器
  • 如何配置Navicat试用期重置脚本实现Mac数据库工具无限使用
  • 预算有限必看:COD消解仪高性价比品牌推荐 - 品牌推荐大师
  • Figma设计文件与JSON双向转换的终极解决方案:打破设计与开发的数据壁垒
  • 胡桃讲编程:混音教学第三步|AI 翻唱实操:软件 + 模型 + 索引全安装(全链接无遗漏・老本专属)
  • 天津婚姻纠纷律师 姜春梅:以法为盾以情为桥 守护津门家庭安宁|咨询热线 400-0073-869 - 外贸老黄
  • 从零到一:在vspm1.0原型机上实现除法运算的探索与思考
  • 你的智能硬件还只能‘哔哔’响?试试用ESP32和minimp3做个网络电台或语音提示器
  • 别再让表格撑爆你的LaTeX文档了!tabularx + X列类型保姆级教程
  • 告别迷茫!C#连接三菱PLC的两种方式(逻辑站 vs IP直连)保姆级对比与选择指南
  • K-Means聚类算法完整指南:从原理到实战
  • AI为何不能代替真人写作,毕竟还是仅仅是传递
  • 2026国产企业龙虾工具哪家比较好?推荐这款开源高效智能体平台 - 品牌2025
  • AI为何不能代替真人写作,说教再多毕竟也没有改变现实社会
  • 闲置京东e卡别浪费!3招轻松“盘活”,加入“可可收”更省心 - 可可收
  • 高精度vs高性价比?余氯仪十大品牌选购终极攻略 - 陈工日常
  • 跨越架构鸿沟:ARM平台Kettle ETL部署实战避坑指南
  • 【QGIS实战篇】QGIS 3.40 栅格计算器:从公式到场景的完整工作流
  • 2026年惠山区正规的代办营业执照公司推荐,注册公司/资质代办/代办公司/代办营业执照/公司注册,代办营业执照公司选哪家 - 品牌推荐师
  • MATLAB与STK互联实战:自动化构建Walker星座的完整指南
  • 解决Termux中lxml安装问题的实例详解
  • 2026年管式炉行业品牌综合排行:优质厂商实力与口碑全梳理 - 品牌推荐大师1
  • 保姆级教程:从零开始为你的STM32智能车设计一块‘靠谱’的供电底板(含LM2596/LM2587选型)
  • 3大技术突破:深度解析Common Voice 25.0数据集架构与高性能应用
  • foobar2000歌词插件OpenLyrics完整指南:打造终极音乐播放体验
  • 2026高安全性OpenClaw替代工具怎么选?推荐企业级智能体 - 品牌2025
  • 从‘特斯拉线圈’到‘家庭插座’:聊聊交流电系统中‘地线’的前世今生与关键作用