缓存穿透、缓存击穿、缓存雪崩、缓存预热
缓存穿透
缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义(查询一个根本不存在的key)
例子:查询一个redis中没有,数据库中也没有的数据,如果高频率的查询,就有可能导致数据库崩溃
出现的基本原因:
- 自身业务代码或者数据出现问题
- 一些恶意攻击、爬虫等造成大量空命中
解决方案:
- 当查询结果为空的话,也把数据加入缓存,也就是加一个空缓存.
- 接口层增加校验:如用户校验、id做基础校验、id<=0的直接拦截
- 采用布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力
缓存击穿
高并发下,由于一个key失效,而导致多个线程去mysql查询同一个业务数据并存到redis(并发下存了多份数据),而一段时间后,多份数据同时失效,导致压力剧增
解决方案
- 分级缓存:缓存两份数据,第二份数据生存时间长一点作为备份,第一份数据用于请求命中,如果第二份数据被命中说明第一份数据已经过期,要去mysql请求数据冲重新缓存两份数据
- 计划任务:假如数据生存时间为30分钟,计划任务就20分钟执行一次更新缓存数据
缓存雪崩
redis服务由于负载过大而导致宕机,导致mysql的负载过大也宕机,最终整个系统瘫痪
例子:大量的key在同一时间失效,导致数据库服务器负载过大
解决方案
- 配置redis集群
- 缓存预热
- 数据不要设置相同的过期时间,不然过期时间
缓存预热
缓存预热就是系统上线后,将相关缓存的数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。用户可直接查询事先被预热的数据。
解决方案
- 直接写一个缓存刷新页面,上线时手工操作一下
- 数据量不大,可以在项目启动的时候自动进行加载
- 定时刷新缓存
本文作者:初夏†失忆
本文链接:https://www.cnblogs.com/Esummer/p/18237914
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步