缓存击穿、缓存穿透、缓存雪崩
缓存击穿
定义
一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。
解决方案
加锁更新
比如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户。这个后面的请求就可以从缓存中拿到数据了。
过期时间组
将过期时间组合写在value中,通过异步的方式不断刷新过期时间,防止此类现象。
缓存穿透
定义
查询缓存和数据库中都不存在的数据。
这样每次请求直接打到数据库,就好像缓存不存在一样。可能会使后端存储负载加大,失去了缓存保护后端存储的意义。
解决方案
缓存空值
数据库不命中之后,把一个空对象或默认值保存到缓存。
问题1,空值会占用更多的内存。可以设置较短的过期时间,自动剔除。
问题2,缓存和DB的数据不一致。可以利用消息队列或其他异步方式清理缓存中的空值。
布隆过滤器
在DB和缓存之前,做一层过滤。在过滤器中保存数据是否存在,若不存在,就不会继续访问。
使用K个不同的哈希函数将这个变量映射为bit列表的K个点,并置1。
如果全是1,就表示key可能存在。
缺点:
- 判断元素是否在集合中有一定错误几率,因为哈希有可能碰撞。
- 不支持删除元素。
缓存雪崩
定义
某一刻缓存大规模失效。
比如缓存服务宕机、大量key在同一时间过期,会使大量的请求直接打到DB上,可能导致整个系统的崩溃。
解决方案
提高缓存可用性
-
集群部署
-
多级缓存
设置多级缓存,第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同。
过期时间
-
均匀过期
可以把不同key的过期时间随机生成,避免过期时间太过集中。 -
热点数据永不过期。
熔断降级
-
服务熔断
当缓存服务器宕机或超时响应时,暂时停止业务服务访问缓存。 -
服务降级
当出现大量缓存失效,且处在高并发、高负荷的情况下,暂时舍弃对一些非核心接口和数据的请求,直接返回一个提前准备好的fallback错误处理信息。