Redis有关缓存穿透、缓存击穿、缓存雪崩的总结

本文解析了Redis缓存穿透、击穿及雪崩现象的原因,并提出了多种应对策略,包括空值缓存、互斥锁及布隆过滤器等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章主要介绍redis的缓存穿透、缓存击穿及缓存雪崩造成的原因及解决方案。

一、缓存穿透

概念:是指查询一个数据库一定不存在的数据。

解释:客户端请求数据,redis中没有,则去数据库查询发现也没有,如果在用户量大或者有人恶意请求则会一直穿过缓存去请求数据库,对数据库造成很大的压力。

解决方式:

1. 在接口层根据业务增加一些用户鉴权校验,非法参数请求校验,降低数据库压力,比如id小于0之类的;

2. 设置空值缓存,在缓存中取不到数据,并且在数据库中也取不到数据,也可以将key-value对写为key-null,但是需要设置一定合理的缓存过期时间,防止正常情况无法使用 ;

3. 设置布隆过滤器,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。

二、缓存击穿

概念:对于一些设置了过期时间的key,这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。

解释:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方式:

1.设置热点数据永远不过期;

2.加互斥锁,如果缓存中有数据则查询到直接返回,如果缓存中不存在数据则加锁让获取锁的这个线程去读取数据,然后后续线程还是读取缓存。比如redis的setNx;

3."提前"使用互斥锁,在读取时对比缓存时间如果快到了则进行加锁,更新时间及重新从数据库拉取数据。

三、缓存雪崩

概念:指缓存大量失效,导致大量的请求都直接向数据库获取数据,造成数据库的压力。

解释:缓存雪崩造成的原因可能是因为我们在设置缓存时大量缓存的过期时间设置的一致或缓存服务器宕机,导致同时过期,大量请求直接奔向数据库。

解决方式:

1. 加锁,减低数据库压力,但是这样的效率比较低;

2. 在设置redis过期时间时加上一个随机数,避免大批数据过期场景 ;

3. 部署分布式redis,在一台redis服务器故障时,立刻将请求转移到另一台。

缓存穿透缓存击穿缓存雪崩是常见的缓存问题,下面是关于Redis缓存穿透缓存击穿缓存雪崩的介绍: 1. 缓存穿透缓存穿透是指当一个请求查询一个不存在于缓存中的数据时,由于缓存无法命中,请求会直接访问数据库。这种情况下,如果有大量的请求查询不存在的数据,会导致数据库压力过大,影响系统性能。 2. 缓存击穿缓存击穿是指当一个热点数据的缓存过期或失效时,大量的请求同时访问该数据,导致缓存无法命中,请求会直接访问数据库。这种情况下,数据库会承受巨大的压力,可能导致数据库崩溃。 3. 缓存雪崩缓存雪崩是指当缓存中的大量数据同时过期或失效时,大量的请求会直接访问数据库,导致数据库压力剧增,性能下降甚至系统崩溃。缓存雪崩通常是由于缓存服务器故障、缓存设置不合理或者缓存数据过期时间设置不当等原因引起的。 为了避免缓存穿透缓存击穿缓存雪崩问题,可以采取以下措施: - 缓存穿透:可以在应用层对查询的数据进行校验,如果数据不存在,则不进行缓存操作,避免大量无效的请求访问数据库。 - 缓存击穿:可以互斥锁或分布式锁来保护热点数据的问,当缓存失效时,只允许一个请求访问数据库并更新缓存,其他请求等待缓存更新完成后再从缓存中获取数据。 - 缓存雪崩:可以采用多级缓存缓存预热、设置合理的缓存过期时间等策略来避免大量缓存同时失效,保证系统的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值