什么是缓存穿透?

要查询的key在redis中不存在,对应的id(对应的值)在数据库中也不存在,此时被非法用户攻击,大量的请求直接打到db上,造成db宕机,从而影响整个系统。这就种现象就称之为缓存穿透。

具体案例举例

在电商项目中,有一个通过一级分类id获取到一级分类下的其他分类的需求接口。

@ApiOperation(value = "获取商品子分类", notes = "获取商品子分类)", httpMethod = "GET")
@GetMapping("/subCat/{rootCatId}")
public JSONResult subCat( @PathVariable Integer rootCatId){if (rootCatId == null){return JSONResult.errorMsg("分类不存在");}List<CategoryVO> subCatList = new ArrayList<>();String catsStr = redisOperator.get("subCat:" + rootCatId);if (StringUtils.isBlank(catsStr)){subCatList = categoryService.getSubCatList(rootCatId);//一般逻辑。只有当数据库查出有值时,存入到redis中if(subCatList != null && subCatList.size() > 0){redisOperator.set("subCat:"+rootCatId, JsonUtils.objectToJson(subCatList));}}}else {subCatList = JsonUtils.jsonToList(catsStr, CategoryVO.class);}return JSONResult.ok(subCatList);}

一般逻辑下,只有当根据一级分类id查出有子分类时,才会把查出的子分类的信息set到redis中。

但是假若有人故意大量的查询没有的一级分类id,因为数据库自然不会有对应的子分类信息,redis中也不会设置对应的key。所以每一次查询都直接打到了db上,一次性大量的流量访问,就会造成缓存穿透。

解决方案

把空的数据也缓存起来,比如空的字符串,空对象,空数组或者list。(在redis中保存为 [])。

这样即使有大量访问请求也是先访问redis,而不是直接访问db了。

上述举例优化解决缓存穿透

@ApiOperation(value = "获取商品子分类", notes = "获取商品子分类)", httpMethod = "GET")
@GetMapping("/subCat/{rootCatId}")
public JSONResult subCat(@ApiParam(name = "rootCatId", value = "一级分类id", required = true)@PathVariable Integer rootCatId){if (rootCatId == null){return JSONResult.errorMsg("分类不存在");}List<CategoryVO> subCatList = new ArrayList<>();String catsStr = redisOperator.get("subCat:" + rootCatId);if (StringUtils.isBlank(catsStr)){subCatList = categoryService.getSubCatList(rootCatId);//以下if else 用于防止缓存穿透if(subCatList != null && subCatList.size() > 0){//根据分类id,从数据库中查询到数据,set到redis中,过期时间默认永久redisOperator.set("subCat:"+rootCatId, JsonUtils.objectToJson(subCatList));}else {//根据分类id,从数据库中查询不到数据,// 但是为了防止恶意引起的redis缓存穿透,将null的list也存入到redis中(即[])// 并且设置过期时间。这样就算以后对应的分类id下新增了子分类(db查询有数据),也可以覆盖掉redis中存的[]。redisOperator.set("subCat:"+rootCatId, JsonUtils.objectToJson(subCatList), 60*5);}}else {subCatList = JsonUtils.jsonToList(catsStr, CategoryVO.class);}return JSONResult.ok(subCatList);}

Redis缓存穿透与解决方案相关推荐

  1. 【redis】redis缓存穿透及解决方案|缓存穿透,缓存击穿,雪崩的理解

    |目录 缓存穿透 解决方案 布隆过滤 缓存空对象 缓存雪崩 解决方案 1.保证缓存层服务高可用性 2.依赖隔离组件为后端限流并降级 3.数据预热 4.做二级缓存,或者双缓存策略. 5.缓存永远不过期 ...

  2. 高并发下redis缓存穿透问题解决方案

    一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...

  3. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

  4. Redis 缓存穿透、缓存击穿和缓存雪崩

    目录 Redis 缓存穿透.缓存击穿和缓存雪崩 Redis 缓存穿透(查不到) Redis缓存穿透的解决方案 方案一:接口校验 方案二:缓存空对象 方案三:布隆过滤器 Redis 缓存击穿 Redis ...

  5. Redis缓存穿透问题及解决方案

    Redis缓存穿透问题及解决方案 参考文章: (1)Redis缓存穿透问题及解决方案 (2)https://www.cnblogs.com/lingyejun/p/10087135.html 备忘一下 ...

  6. redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案

    redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案 参考文章: (1)redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案 (2)https://www.cnblogs.com/shisuiliun ...

  7. Redis 缓存穿透、击穿、雪崩现象及解决方案

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了.下面这段逻辑大家 ...

  8. redis缓存穿透问题及解决方案代码实现

    1.定义及解决方案 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护方便 缺 ...

  9. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

最新文章

  1. 数字内容交易平台php,Demila数字内容交易系统 v1.0
  2. 【STM32】端口复用和重映射,完全重映射,部分重映射
  3. JS函数中的arguments
  4. 当null检查非常失败时
  5. hprose for java 教程_hprose for java源码分析-4
  6. P53:进化了8亿年的抑癌基因
  7. css中设置微软雅黑时,在ie6css中有些样式会失效的解决办法
  8. (转) Arcgis for js加载百度地图
  9. 补装老版本的Java SE
  10. java蘑菇岛种子_我的世界:Java版玩家笑开了怀,4个地图种子,2个内陆蘑菇岛...
  11. jQuery实现瀑布流
  12. Atitit 远程存储与协议 mtp ptp rndis midi nfs smb webdav ftp hdfs v3 Atitit mtp ptp rndis midi协议的不同区别
  13. selenium-滚动
  14. 不干胶标贴打印模板下载_使用Word制作不干胶标签的方法
  15. LiveVideoStack线上分享第四季(九):360视频云Web前端HEVC播放器实践剖析
  16. uni-app设置原生标题栏渐变色
  17. Pygame简易版2048小游戏:超详细解说,看完还不会可以剁手了(附完整源码)
  18. IT 工作中常用的英语单词
  19. 计算机网络的组成和主要功能,计算机网络的组成与功能
  20. CF411H 被遗忘的树 Havel定理 || 网络流

热门文章

  1. matlab对文本文件、数据文件等的文件读取、操作等实用功能总结
  2. 网站通用后台框架代码,自适应显示器高度和宽度
  3. Java系列之传值还是传址,你清楚了吗?
  4. 如何用iMindMap制作布局统一的思维导图?
  5. 成都锦城学院期末成绩
  6. 牢牢守住自建房安全整治“三条防线”
  7. [量化-030]金融哲学-道德经解读-001-道德经的版本问题
  8. Microsoft Word 插入代码块
  9. wsus无法获取计算机,客户端不能从WSUS服务器取得更新故障
  10. python元组索引_Python 元组、列表