java - redis 缓存穿透 一、缓存穿透定义查询一个数据库里面根本不存在的数据Redis 查不到 → 去查 MySQLMySQL也查不到。缓存永远不会生效每一次请求都会直接打到数据库。举例子商铺 id 数据库最大只有 10但是有人疯狂请求id-1、id99999。Rediscache:shop:-1不存在 → 返回null代码去查 MySQL数据库没有这条记录返回null不会往Redis存任何东西下一次再来请求-1流程又重复一遍又访问数据库如果恶意发起成千上万次这种不存在 id 的请求数据库压力直接被打崩这就是缓存穿透。区分记忆缓存击穿数据是存在的只是缓存刚好过期缓存穿透这条数据压根就不存在于数据库解决方法1缓存空值小项目首选核心思路数据库查不到数据时向Redis存一个空字符串并且设置一个短过期时间2分钟。下次再来相同请求Redis拿到直接返回失败不再访问数据库。你项目里面对应的核心代码OverridepublicResultqueryById(Longid){// 1. 从 redis 查询商铺缓存StringkeyCACHE_SHOP_KEYid;StringshopJsonstringRedisTemplate.opsForValue().get(key);// 2. 判断是否存在有真实的商铺JSON数据if(StrUtil.isNotBlank(shopJson)){// 3. 存在直接返回ShopshopJSONUtil.toBean(shopJson,Shop.class);returnResult.ok(shop);}// 判断命中的是否是空值【解决缓存穿透】// shopJson 不是 null但却是 空字符串命中空缓存if(shopJson!null){// 说明 Redis 存了空字符串代表缓存不存在returnResult.fail(商铺不存在);}// 4. 缓存未命中查询数据库// 只有 shopJson null 的时候才能跑到这里ShopshopgetById(id);// 5. 数据库没查到if(shopnull){// 写入空值过期时间 2 分钟stringRedisTemplate.opsForValue().set(key,,CACHE_NULL_TTL,TimeUnit.SECONDS);returnResult.fail(商铺不存在);}// 6. 查询到数据写入 RedisstringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL,TimeUnit.MINUTES);// 返回结果returnResult.ok(shop);}# 什么时候会进到数据库查询shopJsonnull1.第一次访问这个idRedis里面还没有创建任何key2.之前存的空字符串 过期了Redis自动把这个key删掉了3.Redis缓存被手动清空。✅优点简单好实现❌缺点Redis会存很多没用的空key占用一点点内存方案2布隆过滤器海量大数据场景思路提前把数据库所有合法id全部放进布隆过滤器。请求进来先经过布隆过滤器校验。如果过滤器判定id不存在 → 直接拦截Redis、数据库都不去访问如果过滤器判定id存在 → 才放行查询缓存、数据库✅优点完全拦截无效请求不会产生大量空key❌缺点实现复杂布隆过滤器有极小误判概率新增数据要维护过滤器小型项目一般不用方案3接口参数校验第一道防线在最开始就拦截非法参数不往下走缓存逻辑比如商铺id必须大于0if(id0){returnResult.fail(id非法);}三、快速区分三大缓存问题问题本质解决方案缓存穿透查询不存在的数据每次请求直达数据库缓存空值、布隆过滤器、参数校验缓存击穿热点key缓存过期大量并发同时打到数据库互斥锁、逻辑过期缓存雪崩大批量缓存key同时过期数据库压力瞬间暴涨过期时间加上随机偏移值

相关新闻

最新新闻

旗舰扫地机器人选购与实测:导航、避障和基站才是关键

旗舰扫地机器人选购与实测:导航、避障和基站才是关键

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 1:29:41
量化交易第一课:用Python ccxt拉取OKX K线保存CSV

量化交易第一课:用Python ccxt拉取OKX K线保存CSV

很多人在踏入量化交易的时候,第一件事就是找策略、调参数、跑回测。但真正做过一段你就会发现,最消耗耐心的往往不是策略本身,而是数据。K线不连续、时间戳对不上、同一套策略换个交易所结果就完全变了,甚至回测里跑得漂亮的数据&…

2026/9/3 1:29:41
固体火箭发动机内部弹道MATLAB仿真:从零维模型到工程实践

固体火箭发动机内部弹道MATLAB仿真:从零维模型到工程实践

简介:本资源是一套面向航空航天、动力工程及应用数学等专业高年级本科生与科研初学者的固体火箭发动机内弹道数值仿真MATLAB程序,聚焦燃烧室压力演化、装药燃面变化与喷管流场耦合建模等核心问题,适用于课程设计、综合实践与学位论文研究。压…

2026/9/3 1:29:41
QC-LDPC误码率仿真实战:Matlab避坑指南与工程化框架

QC-LDPC误码率仿真实战:Matlab避坑指南与工程化框架

简介:本资源是一份面向通信工程专业学生与研究人员的QC-LDPC码MATLAB误码率仿真完整实现,聚焦信道编码性能评估这一核心问题,适用于无线/光纤通信系统课程设计、毕业设计及算法验证场景。压缩包共5个文件(4个.m脚本1个.mat校验矩阵…

2026/9/3 1:29:41
C# WinForm实现批量图片压缩工具:核心代码与避坑指南

C# WinForm实现批量图片压缩工具:核心代码与避坑指南

简介:这是一套WinForm批量图片压缩工具的完整源代码,适合.NET初学者和桌面应用开发者用来学习WinForm界面设计、System.Drawing图像处理与批量文件操作。包内共24个文件,以cs源码、csproj工程文件、resx资源文件为主,另含可执行ex…

2026/9/3 1:29:41
高中数学数列递推四大核心模型:取倒数、取对数、待定系数与特征根法详解

高中数学数列递推四大核心模型:取倒数、取对数、待定系数与特征根法详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 1:24:40