缓存穿透、缓存击穿、缓存雪崩的区别和解决方法

本文深入探讨了缓存使用中常见的三大问题:缓存穿透、缓存击穿和缓存雪崩,分析了它们的成因,并提供了有效的解决方案,包括在接口层校验、缓存空结果、使用布隆过滤器、热点数据永不失效、设置互斥锁和提高缓存服务器可用性等。
摘要由CSDN通过智能技术生成

缓存穿透、缓存击穿、缓存雪崩的区别和解决方法

1. 缓存穿透

1.1 造成原因

先看一段标准的Redis缓存使用代码:先访问缓存,如果未命中则访问数据库。如果命中数据库则返回并将数据加载到缓存中。但是如果数据库中也没有该数据,比如黑客通过构造不存在的主键查询(id=-1, id=不存在),则会造成大量查询落到数据库中造成数据库负载增加甚至崩溃。

1.2 解决方案

1. 在接口层做校验

这是最简单直观的解决方案,通过在Controller层编写代码过滤掉大部分的不合法的查询。但是接口层只能做基础的校验比如负数的校验,用户校验等,因此无法从根本上解决这一问题。

2. 缓存空结果

直接将查询返回的空结果缓存到数据库中,这个方案实现起来非常简单但是非常有效,可以防止攻击用户反复用同一个id暴力攻击,这样查询就不会都落到数据库中造成数据库压力过大。但是这个空结果缓存,应该设置一个较短的过期时间,因为:防止影响该数据后续正常使用,可能数据库只是没来得及更新。

3. 布隆过滤器

这个方法可以看作1. 在接口层做校验方案的升级版,它通过创建布隆过滤器这一数据结构,类似一种Bitmap结构,可以过滤掉数据库中没有的查询。但是维护布隆过滤器也是一个繁琐的工作。

2. 缓存击穿

2.1 造成原因

缓存击穿,与缓存穿透的名字类似,但是他们的很大的区别。缓存击穿更强调“击“,比如当缓存中没有该数据(缓存中该数据超时失效了),恰好此时大量的查询请求到来,全部落到了数据库导致其压力过大而崩溃。
另一种说法是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

但是这两种的关键点都在于热点数据的过期时间,因此解决方案的关键不在于过滤数据库中没有的查询,而是如何保证热点数据的命中率。

2.2 解决方案

1. 热点数据永不失效

对于一些热点数据永不过期,保证热点数据的命中率。或者通过一种续命机制,每命中一次查询,延长热点数据的时间。这样就使得热点数据永远可以被命中。这是最主要最有效的方案

2.互斥锁

这个问题另一个关键在于,大量查询同时到来全部落到数据库中,还没来得及将查询结果加载到缓存中。 因此设置一套锁机制,查询时加锁,如果等到缓存加载到数据库释放锁,之后的查询便可以都命中到缓存中。锁的实现在单机情况下可以采用ReentrantLock,分布式集群下可以采用分布式锁。

3. 缓存雪崩

3.1 造成原因

缓存雪崩,可以称为缓存击穿的升级版。缓存大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。或者缓存服务器崩溃造成雪崩。这个问题的解决的关键在于如何保证热点数据的过期时间和缓存数据库的可用性。

3.2 解决方案

1. 设置随机的缓存时间

让缓存不在同一时间过期失效,设置随机的缓存过期时间保护数据库。

2. 热点数据永不失效

与之前的方案相同,保证热点数据能一直存在于缓存中。

3. 提高缓存服务器的可用性

有的时候可能是缓存数据库崩溃了,造成雪崩。连缓存都扛不住,数据库就更加扛不住了,此时应该通过主从副备,集群方式来提高缓存服务器的可用性。

最后

本文简单的列举了使用缓存可能出现的三种问题和解决方案。主要用作记录和学习,欢迎沟通和交流!

缓存穿透缓存击穿缓存雪崩是常见的缓存相关问题,它们可能导致缓存失效或性能下降。下面是对它们的原因解决方法的简要说明: 1. 缓存穿透缓存穿透是指请求的数据在缓存数据库中都不存在,导致每次请求都要访问数据库,增加了数据库负载。主要原因是恶意攻击或错误的查询。 解决方法: - 使用布隆过滤器:在查询前使用布隆过滤器检查请求是否有效,如果无效则直接返回,避免对数据库的查询。 - 设置空对象缓存:将数据库中不存在的值也缓存起来,可以防止频繁查询。 2. 缓存击穿缓存击穿是指一个热点数据失效,导致大量请求同时访问数据库,造成数据库压力过大。主要原因是热点数据过期或删除。 解决方法: - 设置热点数据永不过期:针对热点数据设置永不过期,确保即使失效也能从缓存中获取,并在后台异步更新缓存。 - 互斥锁(Mutex):当缓存失效时,只允许一个线程访问数据库并更新缓存,其他线程等待获取缓存数据。 3. 缓存雪崩缓存雪崩是指缓存中大量的数据同时失效,导致所有请求都要访问数据库,造成数据库负载过大。主要原因是缓存中的数据同时过期。 解决方法: - 设置随机过期时间:为缓存数据设置随机的过期时间,避免大量数据同时失效。 - 使用分布式缓存:将缓存分布在不同的节点上,提高系统的可用性容错能力。 - 数据预热:提前加载热点数据到缓存中,避免在高并发时突然访问数据库。 以上是对缓存穿透缓存击穿缓存雪崩问题的原因解决方法的简要介绍,实际应用中可能还需要结合具体场景进行调整优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值