什么是缓存穿透、缓存雪崩、缓存击穿

文章讨论了缓存中的三种问题——穿透、雪崩和击穿,以及相应的解决方案。对于缓存穿透,提出了缓存空值和使用布隆过滤器的方法;缓存雪崩的解决策略包括Redis集群、多级缓存和随机过期时间;缓存击穿则可以通过加锁更新或异步更新来处理。这些方法旨在维护缓存和数据库的稳定,应对高并发场景。
摘要由CSDN通过智能技术生成

缓存穿透

缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存保护后端存储的意义。

解决方案

缓存空值
在这里插入图片描述

 如果访问数据库后还未命中,则把一个空的对象或默认值缓存到Redis上,之后再访问这个数据就可以在缓存中命中

优点:

  • 实现简单,维护方便

缺点:

  • 额外消耗内存
  • 可能会造成短期的数据不一致

布隆过滤
在这里插入图片描述

除了缓存空对象,我们还可以在存储和缓存之前,加一个布隆过滤器,做一层过滤。

布隆过滤器里会保存数据是否存在,如果判断数据不不能再,就不会访问存储。
布隆过滤器是一个连续的数据结构,每个存储位存储都是一个bit,即0或者1, 来标识数据是否存在。如果数据存在则放行,这个请求会去访问Redis,即使Redis缓存过期,请求也会在数据库中命中。假设判断数据不存在则直接返回

优点:

  • 内存占用较少,没有多余key

缺点:

  • 实现复杂
  • 存在误判可能

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
在这里插入图片描述

解决方案

  • 利用Redis集群提高服务的可用性
  • 给业务添加多级缓存,每一级缓存的失效时间都不同
  • 为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间随机生成,避免过期时间太过集中
  • 热点数据永不过期
  • 给缓存业务添加降级限流策略,当出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息

缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案

  • 加锁更新
    查询缓存,发现缓存中不存在,加锁,让其它线程等待,只让一个线程去更新缓存。
    优点:

    • 没有额外的内存消耗
    • 保证数据一致性
    • 实现简单

    缺点:
    - 线程需要等待,性能受影响
    - 可能有死锁的风险

  • 异步更新
    我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据就会一直在内存中,我们可以采用逻辑过期方案,每次在保存值时额外增加一个逻辑过期时间,这个时间由我们自己来维护,每次拿出数据判断是否过期,如果已经过期则开一个新的线程去异步更新缓存中的数据,并先返回过期的数据
    优点:

    • 线程无需等待,性能较好

    缺点:

    • 不保证数据的一致性
    • 有额外的内存消耗
    • 实现比较复杂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值