缓存穿透+缓存击穿+缓存雪崩

我们与数据打交道的都不是小问题呀,所以本篇介绍Redis的缓存一致性问题。

缓存穿透

概念:缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就像持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了,当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透

img

解决方案:

第一种解决方案:使用布隆过滤器

img

使用布隆过滤器之后,将存储的所有数据放入布隆过滤器,每次进行数据查询时,首先查询布隆过滤器是否存在查询的数据,如果在过滤器中判断存在数据时,在到缓存数据中去查询,如果缓存数据中没有查找的数据,在进入数据查询;如果在过滤器不存在时,则直接返回告诉用户该数据查不到,这样能大大减轻数据库查询压力。

第二种方案:缓存空对象

当数据库中不存在查找的数据时,这时把返回的空对象也保存在缓存数据中,同时为该空对象设置一个过期时间,在之后访问该数据时,数据将从缓存中获取,保护了数据库。

存在问题:

1、对空值设置过期时间,会存在更新数据库数据到缓存数据失效的一段时间,缓存数据有问题,这样对保证数据的一致性业务造成影响

2、同时也会需要更多的空间来存储更多的控制,造成内存中有大量的空值的键

缓存击穿

缓存击穿是指一个key是一个热点数据,在不停的扛着大量的并发,当key在失效的瞬间,持续的大并发就会穿破缓存,直接请求到数据库。对数据库造成瞬间压力过大。

解决方案:

第一种方案:热点数据永不过期

从缓存角度看,没有设置过期时间的数据就不会存在存在过期之后产生的问题

第二种方案:加互斥锁

时候用分布式锁,保证对每个key的访问同一时刻只能一个线程去查询后端服务,其他没有获取锁权限的线程则等待即可

缓存雪崩

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

对于数据库而言,所有请求压力会全部到达数据库,导致数据库调用量暴增,可能也造成数据库宕机的情况

img

解决方案:

第一种方案:Redis采用高可用

这种方案的思路就是将Redis中的数据存放在服务器上,即使一个服务器挂掉,其他服务器还可以继续工作

第二种方案:限流降级

这种思路就是在缓存失效后,通过加锁或者队列来控制读取数据库的线程数量让线程在队列排队,控制整体请求速率,也就是在同一时刻减少并发量。

第三种方案:数据预热

数据预热,即在正是部署服务之前,先访问一遍数据,可以将大部分的数据加载到缓存中,在即将发生大并发之前已经加载不同的key,设置不同的过期时间,让缓存失效的时间更加均匀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值