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的操作了,这里不做阐述。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下