缓存雪崩、缓存击穿、缓存穿透
这里写目录标题
- 0. 前言
- 1. 缓存雪崩
- (1). 什么是缓存雪崩?
- (2). 分析:
- (3). 解决方案:
- 2. 缓存击穿
- (1). 什么是缓存击穿?
- (2). 分析:
- (3). 解决方案:
- 3. 缓存穿透
- (1). 什么是缓存穿透?
- (2). 分析:
- (3). 解决方案:
0. 前言
Redis作为目前使用最广泛的缓存,相信大家都不陌生。但是使用缓存并没有这么简单,还要考虑缓存雪崩,缓存击穿,缓存穿透的问题,什么是缓存雪崩,击穿,穿透呢。缓存击穿通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪崩是由缓存同时失效造成的,三种问题都比较典型,也是难以防范和解决的。本节给出通用的解决方案,以供在缓存设计的过程中参考和使用。。
1. 缓存雪崩
(1). 什么是缓存雪崩?
当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。
(2). 分析:
造成缓存雪崩的关键在于在同一时间大规模的key失效。为什么会出现这个问题呢,有几种可能,第一种可能是Redis宕机,第二种可能是采用了相同的过期时间。
(3). 解决方案:
在原有的失效时间上加上一个随机值,比如1-5分钟随机。这样就避免了因为采用相同的过期时间导致的缓存雪崩。
如果真的发生了缓存雪崩,有没有什么兜底的措施?
使用熔断机制。当流量到达一定的阈值时,就直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。
提高数据库的容灾能力,可以使用分库分表,读写分离的策略。
为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。
2. 缓存击穿
(1). 什么是缓存击穿?
其实跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。
(2). 分析:
关键在于某个热点的key失效了,导致大并发集中打在数据库上。所以要从两个方面解决,第一是否可以考虑热点key不设置过期时间,第二是否可以考虑降低打在数据库上的请求数量。
(3). 解决方案:
- 上面说过了,如果业务允许的话,对于热点的key可以设置永不过期的key。
- 使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。
3. 缓存穿透
(1). 什么是缓存穿透?
我们使用Redis大部分情况都是通过Key查询对应的值,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。假如有大量这样的请求,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。
(2). 分析:
关键在于在Redis查不到key值,这和缓存击穿有根本的区别,区别在于缓存穿透的情况是传进来的key在Redis中是不存在的。假如有黑客传进大量的不存在的key,那么大量的请求打在数据库上是很致命的问题,所以在日常开发中要对参数做好校验,一些非法的参数,不可能存在的key就直接返回错误提示,要对调用方保持这种“不信任”的心态。
(3). 解决方案:
- 把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设置value=“null”,当下次再通过这个Key查询时就不需要再查询数据库。这种处理方式肯定是有问题的,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义。
- 使用布隆过滤器。布隆过滤器的作用是某个 key 不存在,那么就一定不存在,它说某个 key
存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key
是否存在,如果不存在就直接返回。
总结
这三个问题在使用Redis的时候是肯定会遇到的,而且是非常致命性的问题,所以在日常开发中一定要注意,每次使用Redis时,都要对其保持严谨的态度。还有一个需要注意的是要做好熔断,一旦出现缓存雪崩,击穿,穿透这种情况,至少还有熔断机制保护数据库不会被打死。
缓存雪崩、缓存击穿、缓存穿透相关推荐
- 缓存雪崩、击穿、穿透解决方案
用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了. 当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃的了,所以为了避免用户直接访 ...
- 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透
前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...
- 如何解决Redis缓存雪崩、击穿与穿透
Redis最常用使用的场景就是作为业务系统的缓存,既然是作为缓存,那么就不免会碰到缓存常见的问题,即雪崩.击穿与穿透,什么是缓存雪崩.击穿与穿透以及如何解决这几个问题呢?今天我们一起来探讨一下! 一. ...
- Redis 缓存雪崩、击穿、穿透
Redis 缓存雪崩.击穿.穿透 文章目录 Redis 缓存雪崩.击穿.穿透 一.Redis基础 Redis基本数据类型.操作 二.面试相关问题 1.小伙子您好,看你简历上写了你项目里面用到了Redi ...
- 面试填坑之Redis无底洞(一、Redis缓存雪崩、击穿、穿透)
Redis缓存雪崩.击穿.穿透 学习自大佬:https://blog.csdn.net/qq_35190492/article/details/102889333 https://www.cnblog ...
- redis缓存雪崩、击穿、穿透
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.redis缓存雪崩 二.redis缓存击穿 三.redis缓存穿透 前言 主要是介绍一下redis缓存雪崩.击穿. ...
- Redis中的缓存雪崩、击穿、穿透的原因以及解决办法
缓存雪崩.击穿.穿透一旦发生,会导致大量的请求积压到数据库层.如果请求的并发量很大,就会导致数据库宕机或是故障,这就是很严重的生产事故了. 俗话说,知己知彼,百战不殆.了解了问题的成因,我们就能够在应 ...
- 关于缓存异常:缓存雪崩、击穿、穿透的解决方案
关于缓存雪崩.击穿.穿透的解决方案 前言 缓存雪崩 缓存雪崩的原因 解决方案 缓存击穿 解决方案 缓存穿透 解决方案 布隆过滤器 布隆过滤器原理 布隆过滤器如何使用 在Java中使用布隆过滤器 前言 ...
- 如何解决缓存雪崩、击穿、穿透难题?
缓存雪崩.缓存击穿和缓存穿透这三个问题是我们在使用redis做缓存的时候要面临的,一旦发生这三个问题,就会导致大量的请求都积压到了数据库层,有可能导致数据库宕机,进入导致整个系统不可用. 下边,具体看 ...
- Redis核心技术与实战-学习笔记(二十六):缓存雪崩、击穿、穿透
一.缓存雪崩 缓存雪崩:大量应用请求无法在Redis缓存中进行处理,应用请求频繁访问数据库,导致数据库压力激增. 产生原因: 缓存中有大量数据同时过期,导致大量请求无法得到处理 数据保存在缓存中,并设 ...
最新文章
- 0x12.基本数据结构 — 队列与单调队列
- 【Linux】tail命令
- Class.forName()的作用与使用总结
- 老板和主管不懂SEO,乱给SEO人员下指令怎么办?
- python 字符串拼接_Python字符串拼接的6种方法(转)
- C语言项目:黑客帝国之数字雨
- yuv编码成h264格式写成文件
- leetcode1143. 最长公共子序列(动态规划)
- oracle 后台进程管理,Oracle background processes后台进程
- listenfd ---- accept事件
- 追溯微软亚洲研究院发展历史:在中国商业公司如何做研究院
- 7 场不可错过的 AI 技术专题 | 本周直播
- 现在可以把小程序交给第三方开发或管理了
- 小学期学Java有感
- 陷阱技术探秘 ----动态汉化Windows技术的分析
- python小助手_如何用python写个人专属群聊提醒小助手?
- Java密码学原型算法实现——第二部分:单钥加密算法
- 闻伟拟将团车网私有化:7个季度亏损接近3亿元,有股东大幅减持
- 老站长教你分分钟学会发布有效SEO优化外链
- android应用开发-从设计到实现 3-4 静态原型的状态栏
热门文章
- leetcode 45.跳跃游戏2
- 【老生谈算法】matlab实现图像平滑算法——图像平滑算法
- 虾皮二面:JVM内存布局你知道的都说一下?
- python中scatter函数中参数s解释
- 【维生素C语言】第十七章 - C语言预处理(上)
- 出西门子S71200项目支持博图V13sp1V14V15.1 S71200HIM仿真恒压供水系统项目
- 为什么需要数据科学(Stanley C. Ahalt)
- 计算机视觉 ——SIFT算子
- jquery.gritter.js简介
- Hadoop_HDFS_Shell