• 解决缓存应用的三座大山:缓存雪崩,缓存击穿,缓存穿透
  • 发布于 2个月前
  • 271 热度
    0 评论
  • 弄潮儿
  • 1 粉丝 30 篇博客
  •   
缓存雪崩
什么是缓存雪崩
缓存雪崩就是指缓存由于某些原因(比如 宕机、cache服务挂了或者不响应的原因)导致缓存整体crash掉了,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。

如何解决缓存雪崩问题
解决缓存雪崩问题最常用的一种方案就是保证Redis的高可用,把Redis搞成集群模式,使之高可用,为了防止所有缓存在同一时间内过期,可以为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效。

缓存击穿
什么是缓存击穿
缓存击穿指的是某个key 一直在扛着高并发,所谓扛着高并发就是说大量的请求都是获取这个 key 对应的值。而这个 key 在某个时间突然失效了,那是不是就意味着大量的请求就无法在缓存中获取数据了,而是去请求数据库了,这样很有可能导致数据库被击垮。这就是缓存击穿。

如何解决缓存击穿问题
那现在问题知道了,该如何应对呢?这个就比较简单了,既然这个 key 这个受欢迎,那么就不要设置过期时间了,如果该key的数据更新了,那么就通过互斥锁的方式将其更新。

缓存穿透
什么是缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了。

如何解决缓存穿透问题
最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
用户评论