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

本文介绍了缓存系统中常见的三大问题:缓存穿透、缓存击穿和缓存雪崩,以及针对这些问题的解决方案。缓存穿透可通过存储空对象和使用布隆过滤器来防止;缓存击穿可采取设置永不过期或加互斥锁的方法;缓存雪崩则可以通过避免数据同时过期、设置永不过期和使用互斥锁来解决。同时,构建高可用的Redis服务也是预防措施之一。
摘要由CSDN通过智能技术生成

1 缓存穿透

问题描述

客户端查询缓存和数据库中均不存在的数据,使得请求直达存储层,导致其负载过大,甚至宕机。出现这种情况的原因,可能是业务层误将缓存和库中的数据删除了,也可能是有人恶意攻击,专门访问库中不存在的数据。

解决方案

  • 缓存空对象:存储层未命中后,仍然将空值存入缓存层,客户端再次访问数据时,缓存层会直接返回空值。
  • 布隆过滤器:将数据存入布隆过滤器,访问缓存之前以过滤器拦截,若请求的数据不存在则直接返回空值。

2 缓存击穿

问题描述

一份热点数据,它的访问量非常大。在其缓存失效的瞬间,大量请求直达存储层,导致服务崩溃。

解决方案

  • 永不过期:热点数据不设置过期时间,所以不会出现上述问题。
  • 加互斥锁:当热点key过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入缓存后释放锁,后续的请求直接走缓存。

3 缓存雪崩

问题描述

在某一时刻,缓存层无法继续提供服务,导致所有的请求直达存储层,造成数据库宕机。可能是缓存中有大量数据同时过期,也可能是Redis节点发生故障,导致大量请求无法得到处理。

解决方案

  • 避免数据同时过期:设置过期时间时,附加一个随机数,避免大量的key同时过期。
  • 永不过期:热点数据不设置过期时间
  • 加互斥锁:当热点key过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入缓存后释放锁,后续的请求直接走缓存。
  • 构建高可用的Redis服务:采用哨兵或集群模式,部署多个Redis实例,个别节点宕机,依然可以保持服务的整体可用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值