缓存穿透、缓存击穿、缓存雪崩、缓存预热

缓存穿透

缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义(查询一个根本不存在的key)
例子:查询一个redis中没有,数据库中也没有的数据,如果高频率的查询,就有可能导致数据库崩溃
出现的基本原因:
  1. 自身业务代码或者数据出现问题
  2. 一些恶意攻击、爬虫等造成大量空命中
解决方案
  1. 当查询结果为空的话,也把数据加入缓存,也就是加一个空缓存.
  2. 接口层增加校验:如用户校验、id做基础校验、id<=0的直接拦截
  3. 采用布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力
 

缓存击穿

高并发下,由于一个key失效,而导致多个线程去mysql查询同一个业务数据并存到redis(并发下存了多份数据),而一段时间后,多份数据同时失效,导致压力剧增
 
解决方案
  1. 分级缓存:缓存两份数据,第二份数据生存时间长一点作为备份,第一份数据用于请求命中,如果第二份数据被命中说明第一份数据已经过期,要去mysql请求数据冲重新缓存两份数据
  2. 计划任务:假如数据生存时间为30分钟,计划任务就20分钟执行一次更新缓存数据

缓存雪崩

redis服务由于负载过大而导致宕机,导致mysql的负载过大也宕机,最终整个系统瘫痪
例子:大量的key在同一时间失效,导致数据库服务器负载过大
 
解决方案
  1. 配置redis集群
  2. 缓存预热
  3. 数据不要设置相同的过期时间,不然过期时间
 

缓存预热

缓存预热就是系统上线后,将相关缓存的数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。用户可直接查询事先被预热的数据。
 
解决方案
  1. 直接写一个缓存刷新页面,上线时手工操作一下
  2. 数据量不大,可以在项目启动的时候自动进行加载
  3. 定时刷新缓存

本文作者:初夏†失忆

本文链接:https://www.cnblogs.com/Esummer/p/18237914

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   初夏†失忆  阅读(2)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起