当前位置:网站首页>一分钟get:缓存穿透、缓存击穿、缓存雪崩
一分钟get:缓存穿透、缓存击穿、缓存雪崩
2022-08-02 03:26:00 【Park33448】
一、缓存架构图
(1)在没有引入缓存的时候,我们请求的数据都是上数据库直接查询了。
(2)引入缓存之后,我们在获取数据时会先去缓存看看有没有缓存数据,有直接返回,没有上数据库进行查询,然后设置到缓存中,再进行返回。
(3)并不是所有的数据都要放到缓存中了:访问频率低的、读少写多的、一致性要求高的,这些就不要缓存了。
二、缓存穿透、击穿、雪崩
2.1 缓存穿透
我们先来看下缓存穿透的定义吧,如下:
缓存穿透:在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接落到数据库上,如活动系统里面查询一个不存在的活动。
这个名词取的多形象呐,缓存穿透。你从何而来,要到到何处,从缓存过来,到数据库去。直接从缓存穿、透过去了,有点是绕开了缓存的意思。
简单说就是
缓存穿透:请求未命中缓存,直接到数据库,这就是缓存穿透。比如:查询一个不存在的值的时候,如发起为id为“-1”的数据或id为特别大不存在的数据
2.2 缓存击穿
理解了缓存穿透,接下来咱们来讲缓存击穿,注意这两个差别。
缓存穿透是查询一个不存在的数据,导致每次都打到数据库上了。缓存击穿,是确实在缓存有数据,我很用心的给你传了一个活动id = 666的。
缓存是有失效时间的吧,那么如果缓存刚好到期了,而此时有有大量请求过来,直接打到了数据库。看看定义吧:
缓存击穿:缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
一般这样的key都是热点key,玩过秒杀,秒杀中的key就是热点key。
就是热点key在高并发下刚好过期了,这些秒级请求直接打到数据库,如果数据库处理不过来,那就挂了。所以缓存击穿简单理解就是:
缓存击穿:热点key,缓存过期,直击数据库。比如:秒杀活动的时候,大量用户进行抢购某个商品,而此时刚好key过期了,那么这些请求就直接命中到数据库了。
我们再来从词理解下这个意思。你看缓存击穿,何谓击穿,不就是有一个东西顶着,然后没顶住,就穿过去了嘛。请求击倒缓存,缓存碰巧开小差了下,就穿到数据库了。
2.3 缓存雪崩
大量雪对应缓存中的就是大量的key,崩塌就是缓存过期失效了,这就造成缓存雪崩了,直接请求到数据库了,同样的我们看下定义。
缓存雪崩:大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。
BTW:击穿与雪崩的区别即在于击穿是对于某一特定的热点数据来说,而雪崩是全部数据。
三、缓存穿透、击穿、雪崩进阶理解
3.1 理解一
递进关系
上面在介绍的是从无到有,再到多的一种方式。当我们正常使用缓存的时候,设置key,获取key。这个使用起来不会有啥问题,但是攻击者不乖哦,就不按照正常路子来,要么不来,要么就多来了。
- 当“无key”的时候,也就是key不存在,这时候频繁请求,就会越过缓存,造成缓存穿透。
- 当“有一key”且很“火热”的时候,也就是热点key,这时候频繁请求,碰巧缓存过期了,就会造成缓存击穿。
- 当“有多key”的时候,也就是说大量的key,在同一时间失效了,欧侯,这时候就都请求到数据库了,这就会造成缓存雪崩了。
3.2 理解二
我们也可以这么理解,上面缓存的三种情况,就是在缓存在高并发下的并发问题。
高并发下,不停的访问一个不存在的key,造成请求绕过了缓存系统,请求落到了数据库,就造成了缓存穿透。
高并发下,不停的访问一个热点key,在缓存失效的时候,请求在此时落到了数据库,就造成了缓存击穿(缓存击穿,本来是有人挡着的,但是利用了缓存失效的间隙,进行了攻击)。
高并发下,大批量缓存的key同时失效,此时所有请求落到了数据库,造成数据库压力过大,这就是缓存雪崩。
四、缓存穿透、击穿、雪崩如何解决?
4.1 缓存穿透如何解决?
(1)在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接return。
(2)缓存NULL值,但是缓存NULL的时间不能太长,否则NULL数据长时间得不到更新,也不能太短,否则达不到防止缓存击穿的效果。
(3)布隆过滤器(Bloom Filter):类似于哈希表的一种算法,用所有可能的查询条件生成一个bitmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。
4.2 缓存击穿如何解决?
(1)设置热点数据永远不过期。
(2)使用加互斥锁:对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入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;
}
}
4.3 缓存雪崩如何解决?
(1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
(2)设置热点数据永远不过期。
总结
(1)缓存穿透:查询一个不存在的值时,未命中缓存,直接落到了数据库。解决方案:接口校验、缓存NULL值、Bloom Filter。
(2)缓存击穿:热点key,缓存过期,直击数据库。解决方案:设置永不过期、加锁互斥获取数据。
(3)缓存雪崩:大量的缓存key在同一时间失效,导致大量请求落到数据库上。解决方案:设置用不过期、随机过期时间。
边栏推荐
- File upload vulnerability
- hackmyvm: may walkthrough
- hackmyvm: kitty walkthrough
- laravel 写api接口时 session获取不到处理办法
- v-bind usage: class dynamic binding object array style style and function method
- CSRF (Cross Site Request Forgery)
- PALISADE:CKKS的使用
- CTF-Neting Cup Past Topics
- (5) Modules and packages, encoding formats, file operations, directory operations
- Laravel 验证唯一时排除修改时的数据
猜你喜欢
Larave 自定义公共函数以及引入使用
强化学习笔记:DDPG
Alfa: 1 vulnhub walkthrough
CTF-网鼎杯往届题目
What are the killer super powerful frameworks or libraries or applications for PHP?
laravel 写api接口时 session获取不到处理办法
Praying: 1 vulnhub walkthrough
[Hello World教程] 使用HBuilder和Uni-app 生成一个简单的微信小程序DEMO
VIKINGS: 1 vulnhub walkthrough
Syncthing文件同步方案完全攻略(亲测有效)
随机推荐
PHP hash加密与解密
(1) introduction to Thinkphp6, installation view, template rendering, variable assignment
Alfa: 1 vulnhub walkthrough
利用cookie获取admin权限 CTF基础题
元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?
解密:链动2+1的商业模式
v-bind usage: class dynamic binding object array style style and function method
CTF之xxe
(1) the print () function, escape character, binary and character encoding, variables, data type, the input () function, operator
【泰山众筹】模式为什么一直都这么火热?是有原因的
Basic use of v-on, parameter passing, modifiers
CTF introductory notes ping
CTF入门笔记之SQL注入
pytorch:保存和加载模型
ES6 three-dot operator, array method, string extension method
SQL注入(6)
考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
The focus of the Dom implementation input triggers
SQL注入(7)
hackmyvm: controller walkthrough