Redis 缓存穿透、缓存击穿及缓存雪崩

本文探讨了缓存穿透、击穿和雪崩问题,提出通过布隆过滤器校验、设置热点数据永不过期、限流降级、redis高可用和数据预热等策略来有效应对这些问题,减轻数据库压力并提高系统稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存穿透

用户查询数据,若redis内存数据库没有(未命中),就会向持久化数据库查询,也没有,则此次查询失败。当存在大量用户去请求这些redis内存数据库中没有的数据时,就都去请求了持久层数据库,会给持久层数据库造成较大压力,这种现象叫缓存穿透。

解决方法:

  • 持久层数据库:当存储层未命中,即使缓存空对象也将其缓存起来,同时设置过期时间,之后再访问此数据就会从redis内存数据库中获取,从而减轻持久层数据库的压力。
  • 布隆过滤器:布隆过滤器为一种数据结构,对所有可能查阅的参数以Hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力。

缓存击穿

缓存击穿是指一个key非常热点,大并发集中对这一个点进行访问,当这个热点非常大的key实效的一瞬间,持续的大并发就击穿缓存,直接请求持久层数据库,会导致数据库压力过大。

解决方法

  • 设置热点数据永不过期

缓存雪崩

缓存雪崩是指在一段时间内缓存集中过期实效。例如双十一零点抢购,有一波商品被购买,那么它们时间比较集中的放入了缓存,假设只缓存了半小时,半小时之后到期实效,那么顾客对这批商品的访问查询就落到了数据库上,对数据库而言就会产生周期性的压力,会造成存储层也挂掉的情况。

解决方法

  • 限流降级:在缓存实效后,通过加锁或队列来控制读数据库写缓存的线程数量(比如对某个key只允许一个线程查询数据和写缓存,其他线程等待)
  • redis高可用:既然redis有可能挂掉,那么多增设几台redis,这样一台挂掉之后其他redis还可以继续工作,也就是搭建集群。
  • 数据预热:在正式部署之前,先把可能的数据预先访问一遍,这样大部分可能大量访问的数据就会加载到缓存中,在即将发生大并发访问前先手动触发加载缓存不同的key、设置不同的过期时间,让缓存实效的时间点尽量均匀(不集中)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值