一、缓存预热
1.什么是缓存预热?
当系统上线时,缓存内还没有数据,如果直接提供给用户使用,每个请求都会穿过缓存去访问底层数据库,如果并发大的话,很有可能在上线当天就会宕机,因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,这种操作就成为"缓存预热"。
2.问题排查
- 请求数量较高
- 主从之间数据吞吐量较大,数据同步操作频度较高
3.解决方案
1.日常例行统计数据访问记录,统计访问频度较高的热点数据
2.利用LRU数据删除策略, 构建数据留存队列
3.将统计结果中的数据分类, 根据级别, red is优先加载级别较高的热点数据
4.利用分布式多服务器同时进行数据读取,提速数据加载过程
二、缓存穿透
1.什么是缓存穿透?
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
2.问题排查
- Redis中大面积出现未命中
- 出现非正常URL访问
3.问题分析
- 获取的数据在数据库中也不存在,数据库查询未得到对应数据
- Redis获取到null数据未进行持久化, 直接返回
- 下次此类数据到达重复上述过程
- 出现黑客攻击服务器
4.解决方案
- 缓存null:对查询结果为null的数据进行缓存(长期使用, 定期清理) , 设定短时限, 例如30-60秒,最高5分钟
- 布隆过滤:
布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中。
三、缓存击穿
1.什么是缓存击穿?
缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。
2.问题分析
某个热点的key失效了,导致大并发集中打在数据库上。
解决方向:第一是否可以考虑热点key不设置过期时间
第二是否可以考虑降低打在数据库上的请求数量。
3.解决方案
- 使用互斥锁:即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。
- 布隆过滤器:bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。
四、缓存雪崩
1.什么是缓存雪崩?
当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。
2.问题分析
造成缓存雪崩的关键在于同一时间的大规模的key失效,主要有两种可能:第一种是Redis宕机,第二种可能就是采用了相同的过期时间。
3.解决方案
- 给不同的Key的TTL添加随机值
- 利用Redis集群提高服务的可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存