关于redis:你遇到过缓存雪崩缓存穿透缓存击穿么

107次阅读

共计 1153 个字符,预计需要花费 3 分钟才能阅读完成。

封面图

嗨~ 大家好啊,我是阿壮,一个后端程序员。Redis 当初成了缓存“专业户”,很多零碎的缓存都在应用 Redis,Redis 中缓存雪崩、击穿、穿透也成了陈词滥调的问题,明天带大家梳理一下,呈现这些问题的起因和解决方案。

缓存雪崩

呈现的起因

缓存雪崩呈现的起因是当某一时刻产生大规模的缓存生效的状况,比方你的缓存服务宕机了,会有大量的申请进来间接打到 DB 上,这样可能导致整个零碎的解体。

解决方案

  1. 设置不同的过期工夫

比较简单且好了解的计划是咱们在缓存的过期工夫上设置一个 1-5min 的随机值,这样每个缓存的过期工夫反复率就会升高,就能够防止缓存在某一时刻大规模到期的状况。

  1. 针对热 key 设置永不过期

设置热 key 永不过期或者针对行将过期的热 key 应用异步线程一直的刷新过期工夫。

  1. 限流,应用锁或者队列,防止同时刻大量申请打崩 DB

加锁或者队列的形式保障缓存的单线程写,这样能够防止缓存大量生效后,申请短时间内都打到 DB 上。毛病是零碎的吞吐率升高。

  1. 分级缓存

缓存击穿

呈现的起因

缓存击穿和缓存雪崩比拟类似,缓存雪崩是 key 大部分生效,而缓存击穿式热点 key 生效。一个设置了过期工夫的 key 在某个工夫大并发间接申请,并且此时正好过期的状况下,申请在缓存中没有读取到数据就会间接打到 DB 上,导致服务解体。

解决方案

  1. 加锁更新

比方申请查问 A,发现缓存中没有,对 A 这个 key 加锁,同时去数据库查问数据,写入缓存,再返回给用户,这样前面的申请就能够从缓存中拿到数据了。

  1. 针对热 key 设置永不过期
  2. 限流,应用锁或者队列,防止同时刻大量申请打崩 DB

缓存穿透

呈现的起因

根本原因是申请了缓存中不存在的 key,导致每次申请都打到 DB 上。通常处于零碎容错思考,咱们会在查问后如果有后果则写入到缓存,这样下一次申请时就能够间接从缓存中读取数据。而后当申请的 id 在数据库中存在时,比方数据库中主键应用的自增 id,而申请的是 -1,那么这将导致缓存中不存在这个数据而每次申请都会从数据库中查,这就失去了缓存的意义,当并发量很大时会导致系统宕机。

解决方案

  1. 尽管从 DB 中查到的空,然而依然把数据写到缓存

这是最简略粗犷的办法,不论从 DB 中查到的是什么都会写入到缓存,缓存有效期设置短些即可,比方 <=5min。

  1. 应用布隆过滤器

布隆过滤器的原理是在你存入数据的时候,会通过散列函数将它映射为一个位数组中的 K 个点,同时把他们置为 1。当用户来查问 A,而 A 在布隆过滤器值为 0,间接返回,就不会打到 DB 了。应用布隆过滤器之后会有一个问题就是误判,因为它自身是一个数组,可能会有多个值落到同一个地位,那么实践上来说只有咱们的数组长度够长,误判的概率就会越低。

  1. 做好参数校验

拦挡非法的参数就能够缩小 DB 中查不到数据的状况。

我是阿壮,一个后端程序员,微信搜一搜:科技猫,获取第一工夫更新,咱们下期见

正文完
 0