redis的作用——缓存作用(个人认为就是将一些常用数据放到内存上,用的时候直接拿,这样用户在进行请求的时候就直接从redis里面拿,而不去数据库中拿,这样就减轻了数据库的压力)。
下面介绍的三个场景就是在特定的情况下redis没有发挥到我们预期的情况。
1.缓存雪崩现象一般redis的数据都是有过期时间。当大量的数据在同一时间失效,此时大量的用户请求就会直接请求我们的数据库,此时就有可能将我们的数据库打崩。(这个场景和下面要说明的两个场景的区别在于这个是对不同的数据,下面两个场景是对一条数据)
本来我们的预期是:
但是由于redis里面的大量的值在同一时间过期(在这一瞬间redis就相当于没有),这些请求redis中没有,就去了mysql中请求数据(此时还没有同步到redis中)就出现了这种情况:
在上图的情况下,就有可能会打崩我们的数据库。
解决我们的期望是,redis帮我们拦住请求,但是redis的数据如果没有过期时间,redis数据库就会存有大量的垃圾数据。存入redis的数据的过期值添加一些随机数,这样数据不会大量的在同一时间过期,即使有一部分数据过期了,访问了数据库,也不会出现问题,访问到数据库后又会将这个数据存入redis,这样就避免了缓存雪崩问题。
2.缓存击穿缓存击穿现象,缓存中没有但数据库中有的数据(一般是缓存时间到期)
一般针对redis中的热点数据(这里与雪崩区分是一条数据),比如:我们在双十一的时候,对一台电脑进行秒杀活动,到到秒杀时间的时候,redis中没有该数据(可能由于数据过期),此时用户对这一条数据进行的请求非常大,这些请求就会涌入数据库,也可能会打崩我们的数据库。
正常情况下,用户访问热点数据
这一条热点数据出现问题(过期),此时其他的redis数据是完好的。
在这个热点数据出现问题的这一瞬间,这些请求就打到了数据库上,可能会打崩数据库。
解决我们的期望是,redis帮我们拦住请求,但由于redis的缓存时间到期的那一瞬间,请求过大,请求到数据库中的量太大,所以解决这个问题的方法也就自然而然的出来了——将热点数据设置永不过期。
3.缓存穿透缓存穿透现象,缓存中没有,数据库也没有的数据。
这种是一种不合法的请求方式(攻击方式),比现在我们有一个买电脑的网站,现在出现了搜索手机的请求,在这种情况下我们的数据库和redis中自然都没有,这个请求就穿过了我们的redis,查询数据库,由于我们的数据库中也没有就无法同步到redis。但这种请求如果是故意想要破坏我们网站的一种攻击请求呢?一个黑客不断地发送搜索手机的请求,这样他的请求就打到了我们的数据库上,就可能会将我们的数据库打崩。
正常情况下,用户请求redis。
一个非法的请求。
这样穿透了两层,由于数据库中没有该数据,也就无法同步到redis中,也就是说,这个我要手机的请求无论多少次都能打到我们数据库上,如果用这个请求进行攻击那么就可能会打崩我们的数据库。
解决我们的期望是,redis帮我们拦住请求,但是由于数据库和redis中都没有这样的数据,但请求打到了数据库中。针对这种情况,我们可以使用一个非常数据结构——布隆过滤器(一个由01字符组成的数组,存储了所有的数据是否存在的信息)有关布隆过滤器,我会在以后的文章中进行详细介绍。
总结
redis的三个场景雪崩、击穿和穿透,雪崩是针对大量数据,击穿是指针对热点数据,穿透是指针对redis和数据库中都没有的数据。
无名小辈,才疏学浅,希望这篇文章能够给您带来帮助,希望各位前辈大牛多多指点和批评。



