Redis缓存的雪崩、穿透、击穿

本文介绍了缓存系统中的常见问题及其解决方案,包括缓存雪崩、缓存穿透和缓存击穿。针对缓存雪崩,提出了分散key失效时间和不设置过期时间的策略;对于缓存穿透,建议进行参数合法性校验和使用布隆过滤器;而对于缓存击穿,则推荐使用分布式锁或设置热点key不过期。这些措施有助于提高系统稳定性并减轻数据库压力。
摘要由CSDN通过智能技术生成

前言:
使用缓存的主要目的是为了提高系统的响应速度、减轻数据库的压力。那么一个正常的缓存流程是怎样的呢,看下如下步骤:
1、用户发起查询请求
2、请求来到redis缓存,在缓存中查询到了数据,将缓存中查询到的数据返回给用户
3、缓存中不存在则到数据库查询,返回给用户
4、把数据库中查询到的数据写入缓存,以后后续查询使用


一、缓存雪崩
1、什么是缓存雪崩?
例如每年双十一,全国大量用户访问某电商平台,这个时候 redis 里面的热点 key 大量同一时间失效,导致这个平台直接访问数据库,把大量的请求都打到数据库,这种现象就是缓存雪崩。
简单来说就是 redis 缓存大量 key 在同一时间失效,就像这个雪崩来了一样


2、解决方案
【1】在设置这个缓存的时候,可以将 key 的失效时间分散开,不让大量的 key 在同一时间失效
【2】还有就是比较暴力的方法,不设置这个缓存失效的时间,让 key 永不失效,或者将 key 的过期时间设置的较长


二、缓存穿透
1、什么是缓存穿透?
【1】大家都知道数据表主键一般都是从1开始的增量正数,或是特殊算法生成的字符串,这种情况下如果有恶意攻击发起请求,查询 where id = -1、-2、-3、... 这样的数据,缓存中肯定是没有这样数据的,就到数据库里面查询,也没有查到该条数据,只能返回空数据给前端了
【2】如果某个恶意用户用脚本不断的发这样的请求,直接穿透 redis 打到数据库上,那么所有请求都会打到数据库,而且会一直打到数据库中去,因为 redis 缓存这层根本拦截不到这样的数据,这就是所谓的缓存穿透
【3】简单来说,缓存穿透就是指缓存中没有查询的数据,缓存拦截不到,请求都打到了数据库上


2、解决方案
【1】对请求的参数做合法性校验
【2】数据库无论查出什么结果(无论为不为空),都写入 redis 缓存里面,这样下次用同一个参数发来请求的时候,就直接被 redis 缓存拦截掉了,就不回打到数据库了
【3】使用布隆过滤器,这是一个非常好的方式


三、缓存击穿
1、什么是缓存击穿?
某一个非常热点的 key,在大量的用户请求不断的访问这个热点的 key,当这个热点的 key 突然失效,把请求都打到数据库上,这个过程就是叫做缓存击穿。记住它是击穿某个一个非常热点的 key


2、解决方案
【1】设置这个热点 key 不过期,即不设置失效时间(不推荐)
【2】使用分布式锁,如果是单体应用使用互斥锁


总结:
缓存雪崩:是指大量的缓存热点 key,在同一时间大量的失效,海量请求打到数据库
缓存穿透:是指 redis 缓存里没有查询到想要的数据,直接穿过 redis 打到数据库了
缓存击穿:是指某个一个非常热点的 key,大量的用户去请求这个缓存热点 key,当这个缓存 key 突然失效的时候,这些请求都会打到数据库上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值