redis缓存击穿,穿透,雪崩

redis缓存击穿,穿透,雪崩

redis缓存雪崩

缓存雪崩是指,有大量的缓存在同一时刻过期或者redis宕机,造成大量的请求打入数据库

解决方案:

redis设置过期时间尽量分散,设置随机过期时间。

事前:保证高可用,集群搭建,主从+哨兵,读写分离,cluster集群

事中:本地ehcache缓存 + hystrix 或 sentinel 熔断&限流&降级,避免mysql被打死

事后:redis持久化,快速恢复缓存数据,AOF,RDB

 

redis缓存击穿

缓存击穿是指一个热点key失效,导致大量的请求打入数据库。

解决方案:

设置热点key永不过期

使用本地ehcache缓存+hystrix或sentinel熔断&限流&降级,避免mysql被打死

 

redis缓存穿透

缓存穿透是指恶意请求访问,比如查询id传入负数,数据库和缓存都没有这个数据

问题1:

假设黑客模拟大量请求访问id为-1的数据,这个数据缓存中肯定是没有的,所以这些请求就打到数据库上面了

解决方案1:

把空结果写到缓存中去,比如:key:-1 value:null expire:15s

 

问题2:

如果是-1,-2,-3这样的请求,上面方法反而会起到适得其反的作用,导致redis内存大量消耗

解决方案2:

使用布隆过滤器,布隆过滤器可以返回一个key存在,则这个key可能存在,返回不存在,则一定不存在。

布隆过滤器原理:

布隆过滤器大概是一个数组,或者一个bitmap,一个key请求过来之后,会经过多个hash算法运算,每个hash算法不一样,得到多个hash值,这个时候去记录数组对应下标为1;

列如:添加数据的时候,添加id为1的数据,经过多个hash运算,分别得到 1,3,5的结果

则把数组的结果修改为int[] arr = {0,1,0,1,0,1,0,0,0,0,0,0,0}

id为2的数据来了,hash运算得到3,4,7

则把数组的结果修改为{0,1,0,1,1,1,0,1,0,0,0,0,0}

查询的时候,如果请求为1,那对应hash结果为1,3,5,去数组找到对应下标的结果是否都为1,如果为1,说明这个id存在,可以允许访问。

如果查询-1,那hash运算结果为3,4,6,找对应下标,发现6不为1,所以这个id必不存在,这个请求无效。

问题很明显:

如果布隆过滤器的长度不够的话,可能会出现{1,1,1,1,1,1,1,1,1,1,1,1,1}的情况,那所有请求都会认为存在了。

无法删除数据,对一个数据删除的时候,无法去修改1为0,因为对应的下标可能是其他元素的hash运算结果。

hash算法的个数需要巧妙设计,以及用哪些算法。

不过不用担心用googlet提供的,案例就不多写了

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>19.0</version>
</dependency>

还可以使用布谷鸟过滤器

布谷鸟过滤器原理:

鸠占鹊巢的思想,一个一个挤走。

布谷鸟过滤器是在布隆过滤器基础上的一个改进,他一样计算出多个hash值也叫指纹,这个时候可以把多个hash值看作一个个巢,比如现在id为1的元素,他有3个巢为1,3,5.而且都为null,那他第一次会去随机的一个巢穴,id为2的元素,如果计算得到1,4,7。他去1的位置,发现id为1的已经占了这个位置,那么他会去4,7中随机一个位置,如果1,4,7都被占了,他会随机占一个位置,然后把那个位置上的元素挤走,那个元素根据他的指纹,可以快速找到他其他的巢穴,然后找一个null位置占领。

思想设计还可以,落地实现没有。

缓存穿透总结:

我来写直接用解决方案1,加缓存里面,这个如果是springboot2.x+spring3.1之后,而且引入了redis,那么加一个注解@Cacheable("menu") ,把结果缓存起来。

开启spring-cache配置,缓存结果为null的数据。


spring.cache.redis.cache-null-values=true

切记理论是一回事,落地实现是另一回事,主要还是看公司。

再提一点,可以对恶意请求的ip加入黑名单,那就是Gatway的操作了,这里不做阐述。

posted @   java架构师1  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示