缓存穿透(查不到导致)
缓存穿透指用户要查询一个数据,首先经过redis内存,没有查到,于是向持久层数据库查询,本次查询失败,当用户很多时,频繁向持久层数据库发起查询,会给持久层数据库造成很大的压力,相当于出现了缓存穿透。
解决方案:
布隆过滤器
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合的请求则丢弃,从而避免了对底层存储系统的查询压力。
缓存空对象
当存储层没有查到数据时,返回的空对象也缓存在redis中,同时设置一个过期时间,当客户在访问这个数据时,就可以从缓存中获取空对象,保护了后端的数据库。
存在的问题:
-
空值可以被缓存起来,意味着缓存需要更多存储空间来存储key,多个key都可能value为空
-
即使对空值设置了过期时间,还是会存在缓存yu存储层的数据在一段过期时间内数据不一致的问题
缓存击穿(并发量太大,缓存过期导致)
缓存击穿指一个key非常热点,在高并发情况下,集中查询同一个key,当这个key失效的瞬间,高并发就会穿破缓存,同时请求数据库,并且回写缓存,导致数据库瞬间压力过大。 (例:微博服务器宕机)
解决方案:
加互斥锁
分布式锁:使用分布式锁,保证同一个key通知只有一个线程去查询后端服务,其他线程没有获得锁的权限,等待即可, 将高并发压力转移到了分布式锁,因此对分布式锁考验很大。
缓存雪崩
缓存雪崩指在某一个时间段,缓存集中过期失效,redis宕机。
例如双十一业务高峰期,停掉部分服务,保证主要的服务可用。
解决方案
-
redis搭建集群(异地多活)
-
限流降级
缓存失效后,通过加锁或者队列控制读数据库的线程数量,比如对某个key只允许一个线程查询和写缓存。
-
数据预热
在正式发布之前,将可能的数据预先访问,加载到缓存中,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。