缓存击穿、缓存穿透、缓存雪崩

缓存击穿

定义

一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。

解决方案

加锁更新

比如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户。这个后面的请求就可以从缓存中拿到数据了。

过期时间组

将过期时间组合写在value中,通过异步的方式不断刷新过期时间,防止此类现象。

缓存穿透

定义

查询缓存和数据库中都不存在的数据。
这样每次请求直接打到数据库,就好像缓存不存在一样。可能会使后端存储负载加大,失去了缓存保护后端存储的意义。

解决方案

缓存空值

数据库不命中之后,把一个空对象或默认值保存到缓存。
问题1,空值会占用更多的内存。可以设置较短的过期时间,自动剔除。
问题2,缓存和DB的数据不一致。可以利用消息队列或其他异步方式清理缓存中的空值。

布隆过滤器

在DB和缓存之前,做一层过滤。在过滤器中保存数据是否存在,若不存在,就不会继续访问。

使用K个不同的哈希函数将这个变量映射为bit列表的K个点,并置1。
如果全是1,就表示key可能存在。
缺点:

  • 判断元素是否在集合中有一定错误几率,因为哈希有可能碰撞。
  • 不支持删除元素。

缓存雪崩

定义

某一刻缓存大规模失效。
比如缓存服务宕机、大量key在同一时间过期,会使大量的请求直接打到DB上,可能导致整个系统的崩溃。

解决方案

提高缓存可用性

  1. 集群部署

  2. 多级缓存
    设置多级缓存,第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同。

过期时间

  1. 均匀过期
    可以把不同key的过期时间随机生成,避免过期时间太过集中。

  2. 热点数据永不过期。

熔断降级

  1. 服务熔断
    当缓存服务器宕机或超时响应时,暂时停止业务服务访问缓存。

  2. 服务降级
    当出现大量缓存失效,且处在高并发、高负荷的情况下,暂时舍弃对一些非核心接口和数据的请求,直接返回一个提前准备好的fallback错误处理信息。

posted @ 2022-06-17 10:13  wesson2019  阅读(40)  评论(0编辑  收藏  举报