目录

  • 1、缓存穿透
  • 2、缓存雪崩
  • 3、缓存击穿
  • 4、区别总结
  • 5、加锁实现

1、缓存穿透

描述:
在查询一个数据时,在缓存中不存在,将去数据库进行查询并且数据库中也不存在数据,使得缓存中一直不会存在数据,导致在请求时每次都会到数据库中进行查询,那么失去了缓存意义。

解决:
将数据库中查询出来为null的数据,写入到缓存中并且设置较短的过期时间。
伪代码:

// 出现问题情况
main(){String id = "123";Object obj = Redis.get(id);if(obj ==null){// redis获取数据为空,查询数据库Object dbObj = db.get(id);if(dbObj!=null){Redis.set(id,dbObj);}return dbObj;}return obj;
}
// 解决方案
main(){String id = "123";Object obj = Redis.get(id);if(obj ==null){// redis获取数据为空,查询数据库Object dbObj = db.get(id);if(dbObj!=null){Redis.set(id,dbObj);}// 如果数据库也为null,将null存入缓存,设置较短过期时间(10S)Redis.set(id,dbObj,10,Seconds);return dbObj;}return obj;
}

2、缓存雪崩

描述:
指设置缓存时的大量的key采用了相同的过期时间,在不同的请求进入时缓存的中大量的key刚好过期,导致请求全部转发到数据库中,使得数据库因为压力过大而崩溃。

解决:
在原有过期时间的基础上,加上一个随机值,比如1~60S,使得key的过期时间减少重复性。
伪代码:

// 模拟从数据库查询到大量不同类型数据
main(){List<Object> list = db.getData();// 原有过期时间long expireTime = 10;for(Object obj : list){// 加一个随机值(1~60S)long newTime= expireTime  + (long) (Math.random() * 60);;Redis.set(key,obj ,newTime,Seconds);}
}

3、缓存击穿

描述:
对于一些设置了过期时间的key,这些key被访问的频率非常高,在大量请求同时请求某个key时刚好出现过期的情况,那么对这个key的请求都会转发到数据库中,这就是缓存击穿。
解决:
在大量请求访问某个key时,进行加锁处理,使得其中某一个请求去查询数据库,其他请求进行等待,然后将查询出的数据写入缓存中,再解锁,那么后续的请求就会从缓存中查询到数据,而不是请求数据库。
伪代码:

main(){// 从redis中获取数据,在请求redis前进行加锁,加锁机制根据实际情况定// lock()方法为伪代码,表示加锁,只允许一个请求向下执行lock();// redis获取数据Object obj = Redis.get(id);if(obj == null){// 请求数据库Object dbObj = db.get(id);// 写回到缓存中Redis.set(id,dbObj);}// unlock()方法为伪代码,表示解锁,使得其他请求继续执行// 在其他请求执行Redis.get(id)时,缓存中已经有了数据,不会再去数据库查询unlock();
}

4、区别总结

  • 穿透
    原因:查询redis时查询不到数据,然后去查询数据库也查不到数据,这将导致redis中一直不能缓存到数据。
    解决:将查询为null的数据也放入缓存,并且设置较短的过期时间。

  • 雪崩
    原因:多个key同时失效,高并发下redis查询不到数据,导致大量请求进入到数据库。
    解决:对同一类型不同值的key设置不同的失效时间(比如:对手机类型的各条记录(key)设置不同的过期时间)。

  • 击穿
    原因:对于本该存在于redis中的key,在高并发时key刚好失效,导致大量请求进入到数据库。
    解决:让请求加锁的查询redis,如果没有数据再查询数据库,并且将数据库结果加入到缓存中,后续查询时只能等待上次查询释放锁,再后续请求获取到锁时redis缓存中就已经有了数据,所以不用查询数据库。

5、加锁实现

加锁实现,参考代码《Redis实现分布式锁》

总结:
穿透 — 缓存和数据库中都不存在数据,导致数据一直无法进行缓存;雪崩 — 大量的不同key同时过期,导致大量不同请求访问数据库;击穿 — 大量请求同访问某个在缓存中的key,刚好失效,导致所有请求进入数据库;

什么是缓存穿透、雪崩、击穿以及解决方案相关推荐

  1. 缓存穿透 雪崩 击穿

    缓存穿透 雪崩 击穿 缓存穿透: 大量访问redis不存在的key上,造成数据库压力大,这就是缓存穿透. 缓存雪崩: redis在某一个时间点,大量的key失效,造成访问这些key的指令访问数据库,给 ...

  2. 缓存穿透与击穿问题解决方案

    在互联网场景中缓存系统是一个重要系统,为了防止流量频繁访问数据库,一般会在数据库层前设置一道缓存层作为保护. 缓存是一个广义的概念,核心要义是将数据存放在离用户更近的地方,或者是将数据存放在访问更快的 ...

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

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

  4. Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)

    Redis应用问题解决(缓存穿透.击穿.雪崩.分布式锁) 缓存穿透 问题描述 当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回,缓存中没有就去db中查询,db ...

  5. redis 穿透 雪崩 击穿

    redis 穿透 雪崩 击穿 穿透 击穿 雪崩 穿透 什么是穿透? key对应的数据在缓存中不存在,针对key的请求在缓存中获取不到,请求会到数据库中.缓存没有起到作用,像是被击穿了一样. 如果有恶意 ...

  6. Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案

    目录 缓存击穿 缓存击穿的解决方案 缓存雪崩 缓存雪崩的解决方案 缓存穿透 布隆过滤器 缓存击穿 一般我们会对缓存的key设置过期时间,在高并发下,如果在某一时刻这个key刚好过期,此时持续的大并发请 ...

  7. 轻松易懂的缓存雪崩、穿透、击穿以及解决方案

    缓存雪崩 先来看下雪崩的过程 所谓缓存雪崩,指的是缓存数据同一时间大量失效,所有的请求全打到数据库,导致数据库在巨大压力下挂掉. 比如在双十一的时候,用户都会打开淘宝买东西,有的人是真的有需要买的,有 ...

  8. mysql数据库击穿_缓存穿透、击穿、雪崩区别和解决方案

    自强学堂 文中的cache指缓存,比如redis,db指数据库,比如mysql. 一.缓存的三种模式 这里主要指的是应用代码对 cache 和 db 中数据的维护方式. 1.1 应用代码同时更新 ca ...

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

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

  10. Redis缓存穿透、击穿、雪崩、预热、更新、降级

    Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透.缓存击穿.缓存雪崩.缓存预热.缓存更新.缓存降级.本篇分别介绍这些概念以及对应的 ...

最新文章

  1. 《Clojure数据分析秘笈》——2.6节调整词频值的度量
  2. 布局练习——选择水果
  3. SendMessage、PostMessage原理
  4. 数据分片排序oracle,Oracle数据库的优化
  5. flask 项目基本框架的搭建
  6. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 安装过程
  7. Spring boot 字符集编码
  8. 360浏览器打不开网页_苹果移动端、PC端safari浏览器打不开网页的解决方案!
  9. Maven项目出现web.xml is missing and 《failOnMissingWebXml》is set to true,已解决
  10. python的数组怎么用_python数组的使用
  11. FastDFS的安装及上传下载(二)
  12. 程序员吐槽的“面试造火箭、工作拧螺丝”,用应聘司机的场景还原当下奇葩的面试
  13. windows电脑桌面旋转快捷键
  14. mysql查询周数_MySQL根据年份的周数获取该周起始时间
  15. Laravel5利用163邮箱实现发送邮件mail功能
  16. 一步一步安装及配置R及Rstudio(详细图文)
  17. win7 使用自带无线网卡分享无线网络
  18. 支持U盘数据、误删文件、硬盘数据 、回收站数据恢复的软件
  19. const常量和基础数据类型
  20. Kaggle下载数据集时,手机收不到短信验证码解决方法--亲测有效

热门文章

  1. ios调用系统相册显示英文,修改成中文
  2. Flask实现个人博客系统(附源码),java面试说我基础太差
  3. Unity3D游戏开发之类对象池优化秘籍残篇
  4. 视频教程-【孙伟】APP项目UI设计基础-工具图标设计视频教程-UI
  5. OAuth2客户端明文和用户密码为密文
  6. 滴!请查收携程机票增值会员团队的一年敏捷账单
  7. 联通爱苹果,移动抢苹果
  8. mino文件服务器,Spring-minio
  9. BigDecimal千分位使用
  10. [HCIP]OSPF综合实验