什么是缓存雪崩,什么是缓存穿透,什么是缓存击穿,如何解决 ?

目录

1. 什么是缓存雪崩?如何解决 ?

2. 什么是缓存穿透?如何解决 ?

 3. 什么是缓存击穿?如何解决 ?


1. 什么是缓存雪崩?如何解决 ?

        缓存雪崩是指在短时间内,有大量的缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成巨大的压力,严重的情况可能会导致数据库宕机,这个就是缓存雪崩。

未发生雪崩之前的执行流程:

缓存雪崩的执行流程:

解决缓存雪崩的三种常见方案:

① 加锁排队(效率低)

加锁可以起到缓冲的作用,但是大大影响了效率,降低了系吞吐量,牺牲了部分用户的体验。

伪代码 >>

// 内存查到数据,直接返回
if(....) {
    return ...;
} else {
    // 排队查询数据库 // 也可以使用 semaphore 信号量
    synchronized (myList) {
        data = jedis.get(myList);
        if(!StringUtils.isNotBlank(data)) { // 双重校验
            // 查数据库
            data = getMyList();
            // 放入缓存
            jedis.set(myList, data);
        }
        return data;
    }
}

② 随机化过期时间(主流)

        为了避免大量缓存同时过期,可以在设置缓存时,添加随机时间,这样就可以避免大量缓存同时失效了,而且这个缓存的跨度要大。

jedis.setex(cachekey, exTime+random.nextInt(1000), value);

③ 设计二级缓存 (成本高)

        二级缓存指的是除了 Redis 缓存之外,再设置一个二级缓存,这个二级缓存的过期时间比 Redis 中要大一点。当 Redis 失效后,先查二级缓存,如果查到数据了,Redis 下次就会从二级缓存中同步数据。

        但是设计二级缓存要多写额外的代码,并且会增加系统的复杂性。查询的时候,走二级缓存没有问题,但是应用程序执行写入操作的时候,那么原本只需要保证 Redis 里的数据和 DB 里的数据一致即可,现在要多保证一个二级缓存的一致性,数据的一致性更难保证了。

2. 什么是缓存穿透?如何解决 ?

        缓存穿透是指查询缓存和数据库都无数据,并且数据库查询无数据的时候,出于容错考虑,数据库不会将无数据的结果保存到缓存中,所以每次请求都会查询数据库,这个就叫缓存穿透。

缓存穿透的执行流程:(Redis 和 数据库都被穿透)

解决缓存穿透的两种常见方案:

① 使用布隆过滤器(成本高)

        可以在缓存和数据库之间,搞一个布隆过滤器,缓存查询不结果的时候,查询布隆过滤器,如果布隆过滤器对于这个查询是没有结果的,就不会走数数据库了,直接返回一个无结果就行了,这样虽然可以解决缓存穿透问题,但是成本太高了。

② 缓存空结果(主流)

        每次查询数据库,不管有没有结果,都把数据缓存到 Redis 里面,下一次查询的时候,就不会再访问数据库了。为了防止长时间内查询不到任何信息,可以将空结果的缓存时间设置的短一些。(例如 3~5 分钟)

 3. 什么是缓存击穿?如何解决 ?

        缓存击穿是指某个热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求需要访问这个热点数据,此时这些请求将会给数据库造成巨大的压力,这个就叫缓存击穿。

缓存击穿的执行流程:(Redis 被击穿)

 解决缓存穿透的两种常见方案:

① 加锁排队(效率低)

        这种方式和缓存雪崩加锁排队类似,都是在查询数据库的时候加锁排队,缓冲访问数据的请求,减少给服务器带来的压力。

② 设置永不过期

        对于某些热点数据,也可以设置永不过期,这样就能保证缓存的稳定性,就不会出现缓存击穿的问题了。(如果数据库修改了热点数据,也是要记得及时同步更新的)

③ 使用逻辑过期时间 

        在缓存中设置一个较长的物理过期时间和一个较短的逻辑过期时间。用户请求到来时,首先检查逻辑过期时间,如果逻辑过期但物理过期时间还未到,则返回旧的数据,并触发后台线程更新缓存。

【总结】缓存雪崩、缓存穿透以及缓存击穿三者定义上的区别:

  • 缓存穿透是因为没有缓存数据导致的问题,
  • 缓存击穿是因为某个热点缓存失效而导致的问题,
  • 缓存雪崩是因为同时有大量的缓存失效所带来的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
缓存击穿、穿透和雪崩都是与缓存相关的问题,以下是它们的简要解释: 1. 缓存击穿(Cache Miss): 缓存击穿是指在高并发情况下,一个请求查询一个不存在于缓存中的数据,导致该请求穿透缓存,直接访问数据库。这会导致大量请求同时访问数据库,增加数据库的负载,并降低系统性能。 解决方案: 针对缓存击穿问题,可以使用互斥锁或分布式锁来保证只有一个线程能够访问数据库并更新缓存。另外,可以考虑设置短暂的缓存过期时间,以减少对数据库的频繁请求。 2. 缓存穿透(Cache Penetration): 缓存穿透是指恶意请求或不存在于数据库中的数据不断访问缓存,导致每次请求都直接访问数据库,从而绕过缓存层。这也会导致数据库负载过高,影响系统性能。 解决方案: 为了避免缓存穿透,可以采取一些策略,如对查询结果为空的请求也进行缓存,但将其设置为一个特定的值,例如null。此外,可以通过使用布隆过滤器等技术来过滤无效请求,减轻数据库的负载。 3. 缓存雪崩(Cache Avalanche): 缓存雪崩是指在缓存中大量的数据同时过期或失效,导致大量请求直接访问数据库,造成数据库负载激增,甚至导致系统崩溃。通常是由于缓存服务器故障、程序bug、缓存设置不当等原因引起。 解决方案: 为了应对缓存雪崩,可以采取一些措施。例如,通过设置不同的缓存过期时间,使缓存的失效时间错开,避免同时失效。另外,可以考虑使用多级缓存架构,将请求分散到不同的缓存服务器上,减少单点故障的风险。 总结: 为了避免缓存击穿、穿透和雪崩问题,需要合理设置缓存策略、使用合适的缓存技术,并且进行监控和预警,及时发现和解决潜在问题。此外,合理的系统设计和架构也是减少这些问题发生的重要手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值