缓存穿透

问题描述
缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询。查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力。如不断发起“id=-1”等不可能存在的数据的请求,此时缓存中没有就会向DB读取进而可能导致DB挂掉。

解决方案
1、增加接口层校验
2、每次查询数据库不存在的数据时缓存一个空对象,并设置过期时间(解决单个不存在的key多次查询,造成内存空间浪费)
3、使用布隆过滤器(注意:必须将所有的key都放到布隆过滤器和redis里,否则请求会被直接返回空数据)

缓存击穿

问题描述
对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些请求发现缓存过期一般会从数据库中进行查询并添加到缓存中,这个时候突然大的并发进来会把数据库压垮。

解决方案
1、使用互斥锁:当缓存失效时,不立即去查询数据库,先使用例如redis的setnx命令去设置一个互斥锁,当操作成功返回时在进行load db并将查询的数据添加到缓存当中,否则重试获取缓存的方法,具体逻辑代码如下

public String get(key) {  String value = redis.get(key);  if (value == null) { //代表缓存值过期  //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db  if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功  value = db.get(key);  redis.set(key, value, expire_secs);  redis.del(key_mutex);  } else {  //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可  sleep(50);  get(key);  //重试  }  } else {  return value;        }  }

2、设置热点数据永不过期

缓存雪崩

问题描述
设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部打到数据库,数据库瞬间压力过重雪崩,与缓存击穿的区别是:雪崩是很多key过期,而击穿是单个key

解决方案
1、将缓存的过期时间分散开(在原有失效的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,很难引起key集体失效的情况)
2、缓存永不过期(空间换效率)

一文搞懂Redis缓存穿透/击穿/雪崩相关推荐

  1. 牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩!

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...

  2. Redis缓存穿透击穿雪崩

    目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...

  3. Redis缓存/穿透/击穿/雪崩

    目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...

  4. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  5. 21_Redis_浅析Redis缓存穿透和雪崩

    为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...

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

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

  7. 一张图搞懂 Redis 缓存雪崩、缓存穿透、缓存击穿

    作者 |  雷架 文章来源 | 爱笑的架构师 (id :DancingOnYourCode) 缓存异常场景分类 在实际生产环境中有时会遇到缓存穿透.缓存击穿.缓存雪崩等异常场景,为了避免异常带来巨大损 ...

  8. 一文搞懂 Redis

    一 什么是NoSQL? Nosql = not only sql(不仅仅是SQL) 关系型数据库:列+行,同一个表下数据的结构是一样的. 非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展. ...

  9. Redis缓存穿透击穿和雪崩(八)

    1. 缓存穿透 1.1. 定义 如果用户的请求Redis缓存没有,mysql持久层也没有这个数据,于是本地查询失败.当用户请求很多(或者恶意攻击)且都是这种缓存和持久层都没有命中的情况时,大量的请求持 ...

最新文章

  1. Common Database Security Tasks_5_30
  2. xtrabackup 恢复单个表【转】
  3. 玩点不一样的,如何使用MATLAB实现批量修改文件后缀名,文件名,批量复制文件
  4. 数据结构与算法-队列
  5. CRF(条件随机场) 学习总结
  6. inventor中齿条怎么画_涨知识干货|瀑布怎么画?山水画刀画中的八种分类
  7. 服务器返回文件格式,iOS开发--服务器返回的数据解析
  8. 360html5播放加速,总结:没有讨论加速问题,“视频快速观看”完全支持360种浏览器...
  9. 本地与服务器文件同步软件哪个好,同步软件哪个好,亲身体验的3款免费同步软件介绍...
  10. 空气负氧离子监测系统建设方案
  11. 如何设计网页排版和样式 - 前端页面设计
  12. dxp全称_ad对应的器件名称
  13. mysql+分表+1168,MySQL使用MERGE進行分表實現
  14. CoherenceModel官网翻译
  15. Visitor(访问者)设计模式
  16. char和varchar区别
  17. 50条狗中有多少条病狗?
  18. 解决php的“It is not safe to rely on the system’s timezone settings”问题
  19. 【菜鸟算题】兰顿蚂蚁
  20. 兄弟姐妹们,我终于上岸了,喜获蚂蚁offer,定级p7,万字长文带你走完面试全过程

热门文章

  1. 75. python高级------jsion
  2. 淘宝京东海外代购低价之谜
  3. 三菱plc开发环境以及仿真
  4. python 二重积分_python中求二维积分的方法
  5. Django计算机毕业设计白酒营销管理(程序+LW)Python
  6. 代理模式(Proxy模式)详解
  7. Mysql个人复习篇
  8. Python之文件操作(含os模块)
  9. 【1】WIN10连接上了wifi,但显示无网络访问权限的解决方法
  10. mysql怎么创建数据库创建表空间_mysql怎么创建表空间