缓存击穿、穿透、雪崩及常用解决方案

解决方案,雪崩,常用 · 浏览次数 : 765

小编点评

**缓存击穿** * 先击后穿,即将数据访问后,才穿到数据库。 * 攻击:先攻击热点数据,再穿到数据库。 * 造成:热点数据失效时,大量的请求同时访问该数据,导致数据库压力过大甚至崩溃。 **缓存穿透** * 用户查询一个不存在的数据,导致缓存中没有该数据。 * 造成:无效的查询和资源浪费的现象。 **缓存雪崩** * 在某个时间点,大量的缓存数据同时失效或缓存服务器宕机,导致所有的请求都要去数据库查询,造成数据库压力过大甚至崩溃的现象。 * 造成:大量数据读取,从而使缓存雪崩。

正文

缓存击穿、穿透、雪崩及解决方案

Redis是一种高性能的键值型数据库,它可以用来实现缓存功能,提高应用的响应速度和承载能力。但是,使用Redis缓存也会遇到一些常见的问题,比如缓存击穿、缓存穿透、缓存雪崩。这些问题都会影响缓存的效率和稳定性,所以需要了解它们的原因和解决方案,保障Redis能够正常运行。

击穿、穿透、雪崩的意思

击穿、穿透、雪崩这三个词语很容易混淆,本文先对词语进行理解,再讲解技术

击穿:击穿拆开后,是击和穿。击意为敲打,或做类似敲打的动作穿意为穿透

击是什么?如下图,攻击的意思

image

穿是什么?如下图,穿透,造成的效果就是个

image

雪崩的意思很简单,就是一个字,如下图

image

白话讲解一下,击穿就是先击后穿;穿透就是穿透,有个洞;雪崩就是多,很多很多

再从技术角度说明击穿、穿透、雪崩

image

击穿意为先击后穿。热点数据存在,且能够击中。但是由于热点数据失效从而访问数据库

穿透意为直接穿。由于访问不存在的数据,从而直接访问数据库

雪崩意为多,大量。大量缓存同时失效,从而直接访问数据库

缓存击穿

缓存击穿的定义:某个热点数据在缓存中过期或失效时,大量的请求同时访问该数据,导致数据库压力过大甚至崩溃的现象。通常会发生在数据更新频率较高或者缓存设置了相同的过期时间的时候。

实际上可以这么理解:应该有的数据但是没读到,从而击穿了缓存,直接访问数据库

可采取的方案:

  • 不设置过期时间或设置较长的过期时间:这样可以避免热点数据同时失效,但是也会增加内存占用和数据不一致的风险
  • 定时更新。比如这个热点数据的过期时间是 2 小时,那么每到 1小时50 分钟时,通过定时任务去更新这个热点 key,并重新设置其过期时间
  • 互斥锁:当缓存中没有数据时,只允许一个线程去数据库查询并更新缓存,其他线程等待该线程完成后再从缓存中获取数据。这样可以减少对数据库的并发访问,但是也会降低系统的吞吐量和响应速度
  • 分布式锁:当多个Redis节点存在时,可以使用分布式锁来保证只有一个节点去数据库查询并更新缓存,其他节点等待该节点完成后再从缓存中获取数据。这样可以避免多个Redis节点同时访问数据库,但是也会增加系统的复杂度和延迟

缓存穿透

缓存穿透的定义:

用户查询一个不存在的数据,导致缓存中没有该数据,每次都要去数据库查询,而数据库中也没有该数据,造成无效的查询和资源浪费的现象。通常会发生在用户恶意攻击或者参数校验不严格的时候

实际上可以这么理解:不应该有的数据非要读,从而穿透了缓存,直接访问数据库

可采取的方案:

  • 业务层校验。用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。比如请求参数为主键自增 id ,那么对于请求小于 0 的 id 参数, 明显不符合业务逻辑。
  • 缓存空值:当数据库中没有查询到数据时,仍然将空值或者默认值写入缓存,并设置一个较短的过期时间。这样可以减少对数据库的访问次数,但也会占用一定的内存
  • 使用布隆过滤器:布隆过滤器是一种概率型的数据结构,它可以判断一个元素是否可能存在于一个集合中。可以将所有可能存在的数据的键值哈希到一个足够大的位图中,当用户查询一个数据时,先用布隆过滤器判断该键值是否可能存在,如果不存在则直接返回,如果存在则再去缓存和数据库中查询。这样可以有效地拦截不存在的数据请求,但是也会有一定的误判率和内存开销

缓存雪崩

缓存雪崩的定义:在某个时间点,大量的缓存数据同时失效或者缓存服务器宕机,导致所有的请求都要去数据库查询,造成数据库压力过大甚至崩溃的现象。这种情况通常发生在缓存设置了相同或者相近的过期时间或者缓存服务器遭遇意外故障的场景下。

实际上可以这么理解:大量数据读取,从而使缓存雪崩,直接访问数据库

为了防止缓存雪崩,可以采用以下几种方法:

  • 设置不同的过期时间。可以给缓存设置不同或者随机的过期时间,避免大量的缓存同时失效,造成数据库压力突增
  • 缓存预热:对于即将来临的大量请求,可以将数据提前缓存在Redis中,并设置不同的过期时间
  • 使用多级缓存:可以构建多级缓存架构,比如Nginx缓存+Redis缓存+本地缓存等,当某一级缓存出现问题时,可以从其他级别的缓存中获取数据,增加系统的容错能力
  • 使用限流熔断:可以利用一些限流和熔断组件,对请求进行限流和降级处理,当请求超过系统能承受的阀值时,直接拒绝或者返回默认值,保护数据库不被打垮
  • 使用集群和负载均衡:可以将Redis部署成集群模式,并使用负载均衡组件,比如LVS、HAProxy等,对请求进行分发和转发,提高Redis的可用性和并发能力

总结

本文介绍了缓存击穿、缓存穿透和缓存雪崩三种问题及解决方案。通过本文,可以了解到:

  • 缓存击穿:先击后穿
  • 缓存击穿的解决方案有:设置热点数据永不过期、定时更新、分布式
  • 缓存穿透:将缓存穿了个洞
  • 缓存穿透的解决方案有:业务层校验、缓存空值、布隆过滤器
  • 缓存雪崩:大量失效Key
  • 缓存雪崩的解决方案有:设置不同的过期时间、缓存预热、多级缓存、限流熔断、集群和负载均衡

与缓存击穿、穿透、雪崩及常用解决方案相似的内容:

缓存击穿、穿透、雪崩及常用解决方案

白话理解缓存击穿、穿透、雪崩及常用解决方案

【专项测试系列】-缓存击穿、穿透、雪崩专项测试

作者:刘须华 一、背景概述: R2M 缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数据库资源占满,引起数据库故障。平时对缓存测试时除了关注增删修改查询等基本功能,应该要重点关注缓存穿透、

架构与思维:再聊缓存击穿,面试是一场博弈

1 介绍 在之前的一篇文章《一次缓存雪崩的灾难复盘》中,我们比较清晰的描述了缓存雪崩、穿透、击穿的各自特征和解决方案,想详细了解的可以移步。 最近在配合HR筛选候选人,作为大厂的业务方向负责人,招人主要也是我们自己团队在用,而缓存是必不可少的面试选项之一。下面我们就来聊一聊在特定业务场景下缓存击穿和

缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找

本文提供了一些保证数据一致性和设计分布式锁的策略。这些策略可以在实际应用中帮助开发人员解决相关的问题,确保系统的数据一致性和并发访问的正确性。同时,通过合理地使用缓存和分布式锁,可以提高系统的性能和可靠性。希望对你在面对Redis相关面试题时有所帮助!

redis系列02---缓存过期、穿透、击穿、雪崩

一、缓存过期 问题产生的原由: 内存空间有限,给缓存设置过期时间,但有些键值运气比较好,每次都没有被我的随机算法选中,每次都能幸免于难,这可不行,这些长时间过期的数据一直霸占着不少的内存空间! 解决方案: redis提供8种策略供应用程序选择,用于我遇到内存不足时该如何决策: * noevictio

[转帖]缓存与存储的一致性策略:从 CPU 到分布式系统

https://zhuanlan.zhihu.com/p/151745863 在计算机系统设计实践中,我们常常会遇到下图所示架构: 为了解决单个存储器读吞吐无法满足要求的问题,常常需要在存储器上面增加一个或多个缓存。但由于相同的数据被复制到一个或多个地方,就容易引发数据一致性问题。不一致的数据可能出

从缓存的本质说起,说服技术大佬用Redis

摘要:在技术领域中,没有银弹。我们需要不断探索和研究新的技术,结合具体问题和需求,选择最适合的解决方案。 本文分享自华为云社区《知乎问题:如何说服技术老大用 Redis ?》,作者:勇哥java实战分享。 最近在某问答平台看到一个技术讨论:如何说服技术老大用Redis? “他总觉得用Redis每次都

缓存空间优化实践

缓存Redis,是我们最常用的服务,其适用场景广泛,被大量应用到各业务场景中。也正因如此,缓存成为了重要的硬件成本来源,我们有必要从空间上做一些优化,降低成本的同时也会提高性能。下面以我们的案例说明,将缓存空间减少70%的做法。

缓存与数据库双写一致性几种策略分析

本文将对几种缓存与数据库保证数据一致性的使用方式进行分析。为保证高并发性能,以下分析场景不考虑执行的原子性及加锁等强一致性要求的场景,仅追求最终一致性。

缓存更新的四种策略及选取建议

缓存的四种更新策略,Cache Aside、Read/Write Through 、Write Behind Caching、Refresh-Ahead,本文将介绍这四种策略及如何选择正确的策略