缓存穿透 (查不到导致)
- 用户查询一个数据,缓存中没有就会去持久层数据库中查询,高并发情况下(秒杀),缓存中没有命中,于是都去请求持久层数据库,给持久层数据库造成很大的压力,这个时候就相当于出现了缓存穿透。
解决方案
- 布隆过滤器
布隆过滤器是一种数据结构,把所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力
- 缓存空对象
当持久层数据库不命中时后(数据库中没有),返回一个空对象,并把空对象存储在缓存层中, 下次有用户访问时,则会返回给其一个空对象
存在的问题:
空值被缓存起来,会导致缓存中存放着多个空值的键
无法保证一致性(存在持久层数据库中更新了数据,但缓存层中仍有缓存)
缓存击穿 (量太大,缓存过期瞬间并发大)
- 指一个key非常的热,不停的抗高并发,当key失效的瞬间大量的并发数据直接请求数据库
- 一般是热点数据
解决方法
- 设置热点数据永不过期 缓存数据会满,不是好的解决方案
- 加分布式互斥锁 类似于阻塞队列 当缓存失效,加锁,对于一个key 可保证只有一个线程进去访问持久层,其余的进行等待
缓存雪崩
- 在某一个时刻,缓存集体失效。或者redis宕机
- 缓存集体失效,所有请求全打在持久化数据库上
解决方案
- redis高可用 多增设几台redis ,搭建集群
- 限流降级 1. 加分布式互斥锁 2. 停掉一些服务,保证主要服务的可用 (比如双11的时候不允许退货)
- 数据预热 在正式部署之前,先把可能的数据预先访问一遍,将大量数据加载到缓存中去,并设置不同的过期时间,让缓存失效的时间均匀点