1. 讲个故事

一个人去门店买联想电脑,线下门店没有货了,于是店员给厂家打电话问问有没有货,厂家发现也没货了,这个人就走了。过了一会另一个人也要来买联想电脑,然后店员又打电话问了一次厂家,如此反复。这种情况就是“缓存穿透”。

联想电脑太火了,所有门店都没货了,然而很多顾客都会来门店购买,那么就会有很多门店的很多店员都会给厂家打电话询问有没有货,导致厂家电话被打爆。这种情况就是“缓存击穿”。

不只是联想电脑火,华硕、戴尔也特别火,门店都卖光了,而又有很多人来买电脑,这时候又有很多门店同时打电话咨询厂家,或者因为门店人太多被挤爆了,很多客户自己打电话咨询厂家,厂家电话被打爆。这种情况就是“缓存雪崩”。

2. 一句话总结

2.1 缓存穿透

指缓存服务器中没有要查的数据,数据库中也没有,导致请求每次都绕过缓存服务器去查询下游数据库,缓存服务器失去了应有的作用,数据库访问压力很大。

2.2 缓存击穿

指的是某一个经常被访问的热key缓存过期的那一刻,大量请求访问这个key,会瞬间穿透缓存服务器同时访问数据库,导致数据库访问压力很大,出现过载的情况。

2.3 缓存雪崩

指缓存服务器大量缓存同时过期,或者缓存服务器宕机了,某一时刻所有的请求直接访问到数据库,造成数据库访问压力很大,出现过载,影响性能甚至宕机的情况。

3. 如何解决?

3.1 如何解决缓存穿透?

我们知道这种情况的出现很可能是遭到了恶意攻击,比如发起对id为-1或者很大的数据的访问,这样的数据明显是不会存在到数据库中的,所以也不会返回结果,存储到缓存数据库。这种情况有两种解决方案:

  1. 如果缓存中没有的数据,在数据库中也没有查到,那么我们可以返回value值为null,存储在缓存数据库,设置一个比较短的有效时间,例如30s。
  2. 使用布隆过滤器,过滤掉对id <= 0 或者id很大的访问。

3.2 如何解决缓存击穿?

分清缓存击穿和缓存穿透的区别,缓存穿透多数情况下数据库中是没有这条数据的,而缓存击穿时,数据库是有这条数据的,只是在缓存中过期了,但因为这条数据是热key,并发访问量非常大,所以会导致数据库过载击穿。
我们有如下三种解决方案:

  1. 设置热点key永不过期。
    这里并不是给这个数据的存活时间设置为永久,而是将过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的重建。

  2. 使用互斥锁。
    在单体项目中是这样的原理:数据的缓存过期后,只有首个访问的线程可以访问数据库,其他线程等待这个线程查询到数据,更新缓存后即可直接从缓存中获取数据。
    加锁排队只是为了减轻数据库的压力,并没有提高系统吞吐量。在高并发情况下,缓存重建期间key是锁着的,这是过来1000个请求999个都在阻塞的,同样会导致用户等待超时,这是个治标不治本的方法。所以在高并发场景下,尽可能不使用加锁的方式。
    以下是伪代码:

public static String getData(String key) throws InterruptedException {String result = getDataFromRedis(key);if (result == null) {if (lockObj.getLock()) {result = getDataFromMysql(key);if (result != null) {redis.set(key, result);}lockObj.unLock();}} else {Thread.sleep(100);result = getDataFromRedis(key);}return result;
}
  1. 定时刷新。
    这个和第一条大同小异,我们可以在后台写一个定时任务,假如这条数据的存活时间为10分钟,我们可以每9分钟执行一次定时任务,将数据库中查到的数据更新到缓存中,刷新存活时间。

3.3 如何解决缓存雪崩?

缓存雪崩就是缓存击穿的加强版,所以也可以通过加互斥锁的方式解决。同样,也不适用在高并发的场景下。除了这个,还有以下两种解决方案。

  1. 设置过期时间为随机值。
    我们给缓存设置一个随机的过期时间,使缓存的失效时间可以均匀分布,避免缓存在某一时间大量过期导致缓存雪崩。

  2. 设置一个缓存标记更新缓存。
    缓存标记,记录缓存数据是否过期,如果过期会触发另外的线程在后台去更新实际key的缓存。
    真正的缓存数据过期时间比缓存标记多一倍,当缓存标记key过期后,实际缓存还能把旧数据返回给调用端,直到另外的线程在后台更新完成后才会返回新数据。

面试常问:redis缓存击穿/穿透/雪崩相关推荐

  1. redis——缓存击穿/穿透/雪崩

    缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB). 一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力.这就叫 ...

  2. 你需要知道的缓存击穿/穿透/雪崩

    目录 缓存击穿/穿透/雪崩 Intro 缓存击穿 缓存穿透 缓存雪崩 Reference Contact 缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩 ...

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

    缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题. 缓 ...

  4. Redis缓存击穿、雪崩、穿透!(超详细)

    缓存的击穿.穿透和雪崩应该是再熟悉不过的词了,也是面试常问的高频试题. 不过,对于这三大缓存的问题,有很多人背过了解决方案,却少有人能把思路给理清的. 而且,网络上仍然充斥着,大量不太靠谱的解决方案, ...

  5. Redis数据读取(缓存击穿,穿透,雪崩)

    内容文件参考"付费专栏"可领取.专栏购买者提供本内容"永久答疑和远程协助"服务.一诺千金! N.1 缓存处理流程 1)前台请求,后台先从缓存中取数据,取到直接返 ...

  6. Redis面试常问-- Redis常用数据类型

    Redis常用数据类型 http://www.redis.cn/

  7. Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

    一.前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是 ...

  8. 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应

    谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应 面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上 ...

  9. Redis缓存知识-穿透、击穿、雪崩

    目录 一.Redis介绍 二.Redis做缓存服务器 三.缓存穿透&击穿&雪崩 1.缓存穿透 2.缓存击穿 3.缓存雪崩 大家好,我是杨叔.每天进步一点点,关注我的微信公众号[程序员杨 ...

最新文章

  1. RDKit toolkit实战三:描述符计算及可视化
  2. conda 基本操作
  3. 全球及中国塑料包装行业发展方向与应用前景调研报告2022版
  4. 《系统集成项目管理工程师》必背100个知识点-98大数据的特点
  5. 【转】无法登陆SQL server 服务器的解决办法
  6. “RuntimeWarning: overflow encountered in ubyte_scalars像素加减运算溢出异常”原因以及解决办法
  7. 抽象类必须要有抽象方法吗?
  8. let与expr命令的用法与实战案例
  9. 按键精灵定位坐标循环_用按键精灵录制微信自动摇一摇脚本
  10. 湖南省中职学业水平考试复习试题(计算机三)
  11. UE4 虚幻引擎,3D数学(一),3D坐标系,2D坐标系
  12. 人事考勤系统服务器端,考勤管理,考勤管理系统,人事考勤管理系统,考勤系统 - 新开普(NewCapec)...
  13. sql server的增删改查语句
  14. 【软件后门】qq足迹 - qq应用授权管理
  15. TigerGraph百万美元挑战赛奖项全揭晓,通过图技术解决全球问题的创新方案令人印象深刻
  16. Auto.js脚本开发入门
  17. HTML之基础篇--陈小沫
  18. 油溶性Cu,Mn共掺杂量子点光转换材料
  19. APP上传APP Store遇到的各种问题
  20. oracle查看dlink,oracle创建dlink方法

热门文章

  1. “进厂”第一课:大厂Java岗实习要求大盘点(内附2022/2023校招渠道整理)
  2. 蓝牙耳机与电脑连接使用
  3. 苹果官方要求在iOS App中提供帐户删除选项
  4. 常用Javascript语句
  5. 2022-2028年全球及中国汽车油箱零件行业投资前景分析
  6. 分享前端动画制作的 12 个原则(含代码)
  7. T5L串口屏行业应用之动画图标控件
  8. Z-blogPHP响应式个人博客主题模板,自适应加SEO优化
  9. windows下安装cython-bbox失败
  10. iperf3怎么看结果_网速测试利器-iperf3