Redis的缓存穿透和缓存雪崩

缓存穿透:(查不到导致的)

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

解决方法:

布隆过滤器:

是一种数据结构,对所有都可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,

从而避免了对底层存储系统的查询压力;

缓存空对象:

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

缓存空对象存在两个问题

1.如果把空值缓存起来,会有大量的建存的空置,

2.即使是设置了过期时间,但是还是会造成缓存和数据库中的数据不一致


缓存击穿:(能查到,但是量太大,在过期的瞬间)

缓存击穿是指一个key非常热点,不停的扛着大的并发量,并发集中对这个点进行访问,当这个key在瞬间失效,持续的大并发量就穿破缓存,直接请求数据库.

解决方案:

1.设置热点数据不过期,

从缓存层面看,没有设置过期时间,所以不会出现热点key过期后产生的问题.

加互斥锁:

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


缓存雪崩:

指在一个时间段,缓存集中过期失效,或者redis宕机

如果设置一波商品的过期时间是一小时,恰巧到时间所有的缓存都失效了,这波商品打查询就会全落在数据库上,形成周期性波动. 集中过期不是最致命的,主要是节点宕机产生的雪崩.

解决方案:

redis高可用:多设置几台redis,一旦有宕机的,保证其他的能正常工作.

限流降级:在缓存失效后,通过加锁或者队列的方式来控制读数据库写缓存线程的数量,比如对某个key只允许一个线程查询数据和写缓存,其他线程等待

数据预热:在正式部署前,先把数据预先访问一遍,保证大量的缓存能存到缓存中,在即将大量并发前,将不同的key设置不同的过期时间,让失效时间尽量分散

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值