Redis 缓存雪崩,缓存击穿,缓存穿透的原理以及解决方法

redis在项目中的作用与处理流程

redis的作用

redis作为高速缓存的中间组件,将其放在数据库之前进行筛选一部分数据的读取是非常明智的选择,能够大大降低请求直接打在数据库上而产生响应速度慢的概率。

redis的正常处理流程

客户端发起一个的请求,将收到的key到redis中进行查询,如果Redis存在key所对应的值,那么就会返回对应的value,如果没有对应的value,那么就会在MySQL等数据库中进行查询,如果查询到value就会进行返回,否则就会返回空值。在这个过程中redis直接返回结果是非常迅速的,不会有太多性能问题,但对MySQL中数据进行查询会消耗很多时间,这个地方才是存在性能消耗最大的地方。

redis的正常处理流程

但redis仍然存在一些不完善的地方需要我们来解决

redis存在的问题

假设你的数据库的序列只有1~100中存在value,其他key没有value。


1.缓存穿透

存在这样一种场景,反复请求一个不存在的key,那么这个情况就会穿透redis,直接请求到mysql,然后返回数据为null,如果请求过多就会导致服务器响应变慢。

但还有一种情况,不反复访问通一个不存在的值,而是一些不定的值,对数据库进行攻击,如果使用第一个解决方式就会把redis数据打满了,因为redis存在数据淘汰机制,会淘汰一些老旧的数据,这也会导致数据库变慢。

解决方案

1.你可以写一个缓存器,将查询到为空的数据存放在redis中,如果下一次仍然有这样的请求就会在redis中返回,但是这种方式只能阻挡通过一个key的攻击。

2.写一个布隆过滤器


2.缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决方案

1.设置热点数据用不过时

2.对同一个key添加互斥锁


3.缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案

1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。

3.设置热点数据永远不过期。

posted @ 2020-06-19 08:55  非吾愆期  阅读(458)  评论(0编辑  收藏  举报