缓存穿透(查不到导致)
用户查询一个数据,发现redis内存数据中没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败。当很多用户进行这样的操作时,缓存都没有命中,就会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
解决方案:
- 布隆过滤器:一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免对底层存储系统的查询压力。
- 缓存空对象
缓存击穿(缓存过期导致)
指一个key非常热点,在不停的并发,大并发集中对这一点进行访问,当这个key在过期的瞬间,持续的大并发就穿破缓存,直接请求数据库;而由于缓存过期,会访问数据库查询最新数据并回写缓存,导致数据库瞬间压力过大。
解决方案:
- 设置热点数据永不过期
- 加互斥锁
缓存雪崩
指某一时间段,缓存集体失效或Redis宕机,同时又有大量请求进入,此时压力会直接传到持久层数据库上。
解决方案:
- 限流降级:通过加锁或者队列来限制读写数据库的线程数量。
- 数据预热:在正式部署之前,先把所有可能访问的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。且缓存不同的key时设置不同的过期时间,让缓存失效时间尽可能均匀。