关于Redis缓存穿透和雪崩一个文章彻底搞懂

一.缓存穿透(查不到)

缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

解决方案:
1.布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行检验,不符合则丢弃,从而避免了对底层存储系统的查询压力。

2.缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源。

但是同时有两个问题

1.如果空值被缓存起来,就意味着缓存需要更多的空间存储更多的键。

2.即使对空值设置了过期时间,还是会存在缓存层和储存层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

二.缓存击穿(查的太多)

举例微博服务器宕机(假如过期时间时60秒,60.1秒时恢复了,0.1秒可能就会击穿)

当大量用户同时访问某一个热点,当这个热点的key在失效的瞬间,持续的大并发就击穿缓存,直接请求数据库,就像在屏障上凿开一个动

解决方案:
1.设置热点数据永不过期
2.加互斥锁

分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

三.缓存雪崩

缓存雪崩,是指在某一个时间段,缓存集中过期或者Redis宕机。

产生雪崩的原因之一,比如写文本的时候,马上要双十一零点,很快就要引来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一小时。那么到零点的时候,这批商品的访问查询,都落到了数据库上,对数据库而言,就会产生周期性的压力波峰。于是所有请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

解决方案
1.多设置几台redis,这样一台挂掉还有其他的继续工作,其实就是搭建的集群。
2.限流降级

通过枷锁或者队列来控制读写数据库写缓存的线程数量。比如对某一个key只允许一个线程查询数据和写缓存,其他线程等待。

3.数据预热

数据加热的含义就是在正式部署之前,先把可能的数据都预热访问一编,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值