Redis-----缓存穿透和缓存击穿和缓存雪崩

本文详细介绍了缓存系统中的三种常见问题:缓存雪崩、缓存穿透和缓存击穿。针对缓存雪崩,提出了设置随机失效时间、热点数据永不过期和分散请求时间的解决方案;对于缓存穿透,建议使用参数校验、布隆过滤器和缓存空值;而缓存击穿的应对策略包括设置热点数据不过期和使用互斥锁。这些方法有助于保障系统的稳定性和性能。
摘要由CSDN通过智能技术生成

目录

一、什么是缓存雪崩

1.1  简介缓存雪崩

1.2  缓存雪崩的解决方式

二、什么是缓存穿透

2.1  简介缓存穿透

2.2 缓存穿透的解决方法

三、什么是缓存击穿

3.1  简介缓存击穿

3.2  缓存击穿解决方法


一、什么是缓存雪崩

1.1  简介缓存雪崩

举个简单的例子:我们都知道redis里都是 key-value对。如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是我理解的缓存雪崩。

简单来说就是,由于大部分的key都在某个时间点全部失效,那么这时候的申请就会直接打到数据库上(因为redis上的缓存失效了),然后数据库由于扛不住那么大的压力而挂掉,这就是缓存雪崩。

如下图,左边是redis的缓存还没失效的情况,而右边是缓存失效,请求直接达到mysql数据库上的情况:

同一时间大面积失效,那一瞬间Redis跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的,你想想如果打挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,你怎么重启用户都会把你打挂,等你能重启的时候,用户早就睡觉去了,并且对你的产品失去了信心,什么垃圾产品。

1.2  缓存雪崩的解决方式

1.  失效时间加个随机值

处理缓存雪崩简单,在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效

2.  设置热点缓存数据永远不过期

3.  分散请求时间。给每个客户端一个随机的短暂延迟时间

 

二、什么是缓存穿透

2.1  简介缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

像这种你如果不对参数做校验,数据库id都是大于0的,我一直用小于0的参数去请求你,每次都能绕开Redis直接打到数据库,数据库也查不到,每次都这样,并发高点就容易崩掉了。

2.2 缓存穿透的解决方法

1.  缓存穿透我会在接口层增加校验

比如参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。

2.  布隆过滤器

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

大概原理为:先创建一个长度为n的bitmap,和k个hash函数,当有key加入时,则通过k个hash函数得到k个值,然后把bitmap中对应的比特位设成1。

当判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。

详细如下链接:https://www.cnblogs.com/liyulong1982/p/6013002.html

缺点:无法删除key

3.  把在数据库找不到的key的value暂时设置成null。

从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。

三、什么是缓存击穿

3.1  简介缓存击穿

至于缓存击穿嘛,这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

3.2  缓存击穿解决方法

1.缓存击穿的话,设置热点数据永远不过期。

2. 采用互斥锁,保证同一时刻只有一个客户端可以查询底层数据库这个数据,一旦查到数据就缓存至redis内,避免其他大量请求同时穿过redis访问底层数据库。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值