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

本文介绍了缓存击穿、穿透和雪崩的问题及解决方案,包括异步定时更新、逻辑过期、缓存空值、布隆过滤器的应用,以及通过不同过期时间、redis集群、降级限流和多级缓存来提升系统的稳定性和性能。

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

缓存击穿

当某一 key 的缓存过期时大并发量的请求同时访问此 key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。
解决方案

  • 异步定时更新:某一个热点数据的过期时间是 1 小时,那么每 59 分钟,通过定时任务去更新这个热点 key,并重新设置其过期时间。
  • 逻辑过期:不设置过期时间,在 redis 加载数据库数据时新增过期时间字段,在请求获取数据时若发现数据过期则返回过期数据,同时再更新 redis
  • 互斥锁:当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。

缓存穿透

当缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。
解决方案:

  • 缓存空值:为这些 key 对应的值设置为 null 并放到缓存中,这样再出现查询这个 key 的请求的时候,直接返回 null 即可(需要设置失效时间或者适时更新数据)
  • 布隆过滤器:通过将 key 使用多个 hash 算法得出的值存入为数组来确定一个 key 是否存在,它可以告诉你数据一定不存在或可能存在,相比Map、Set、List等传统数据结构它占用内存少、结构更高效。对于缓存穿透,我们可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

缓存雪崩

当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。
解决方案:

  • 不同过期时间:为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间设置成不同的,并且通过定时刷新的方式更新过期时间。
  • redis集群:使用集群避免服务单点故障,提高可用性
  • 降级限流策略:添加降级限流策略,当缓存失效或服务宕机时,及时降低对数据库的访问请求,保护数据库。
  • 多级缓存:对请求的每个环节,添加缓存,降低对 redis 的压力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值