redis 判断key是否失效_Redis缓存雪崩、击穿、穿透

什么是redis雪崩?

目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。

举个例子:如果所有首页的key失效时间都是12小时,中午12点刷新的,我零点有个秒杀 活动大量用户涌入,假设当时每秒6000个请求,本来缓存在可以抗住每秒5000个请求,但是缓存当时所有的key都失效了。此时1秒6000个请求全部落数据库。

efeac26af65029c4c270aaf6f3fd29df.png

数据库此时必然挂掉,如果挂的是一个用户服务的库,那其他依赖他的库所有接口几乎都会报错,如果没做熔断等策略基本挂一大片。

怎么解决呢?

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

setRedis(Key, value, time + Math.random()*10000);

如果redis是集群部署,将热点数据均匀分布在不同的redis库中也能避免全部失效的问题。或者设置热点数据永远不过期,有热点数据更新就更新缓存(比如商城首页)。

什么是缓存穿透?

缓存和数据库中都没有数据,而用户不断发起请求。id为-1或特别大不存在的数据,一般很可能是攻击者。

121d425d44a206a09da77f8cff718f2b.png

解决办法:对接口参数做校验。

什么是缓存击穿?

缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿是指一个key非常热点,在不停的扛着高并发,并发集中对一个key进行访问,当这个key失效的瞬间,持续的高并发就穿破缓存,直接请求数据库。

解决办法:从缓存取不到数据,在数据库也没有取到,这时可以将对应key的value写为null、位置错误、稍后重试等。

其他办法?

redis的布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生。原理是利用高效的数据结构和算法快速判断出这个key是否在数据库中存在,不存在就return,存在就查DB,刷新key。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>