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

一、缓存的处理流程

前台请求数据,先经过redis,如果数据存在则直接返回结果,不存在则再请求数据库。如果数据库中存在数据,则更新缓存并返回结果,否则就直接返回空结果。

 

二、缓存穿透

是什么?

缓存穿透是指数据库和缓存中都没有数据,而单一用户不断发起请求,导致数据库压力过大。

如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

怎么解决?

1、数据不存在时设置默认值

在查询数据库的时候如果未查询到数据,依然在redis中保存一条记录,把key-value设置为key-null或者其他便于区分的值,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样以后再有请求访问过来就不会redis直接去查库。

2、拦截请求

在redis获取数据前增加查询校验。

比如用户鉴权校验;id做基础校验,id<=0的请求直接拦截;把所有可能存在的查询参数缓存到hash集合中,若某个请求在该集合中存在,则可以访问redis,否则丢弃该请求。

 

三、缓存击穿

1、是什么?

缓存击穿是指数据库中有数据而缓存中没有(一般是缓存到期),这时候由于并发用户特别多,同时读缓存没有读到数据,又同时去数据库中取数据,导致数据库压力瞬间增大

2、怎么解决?

1、设置热点数据永不过期

2、加互斥锁

 

四、缓存雪崩

1、是什么?

缓存雪崩是指缓存中大批量的数据同时过期,而查询数据量巨大,引起数据库压力过大甚至宕机。

和缓存击穿不同的是,缓存击穿是并发查的同一条热点数据过期了,而缓存雪崩是指不同的数据都过期了,导致大量的请求扑向数据库。

2、怎么解决?

1、设置不同的过期时间,防止大批量的数据同时失效;

2、如果缓存数据库是分布式部署,把热点数据均匀地分布在不同的缓存数据库中;

3、设置热点数据永不过期。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

启四

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值