什么是缓存击穿

简介: 缓存击穿是指热点缓存key突然失效,导致大量并发请求直接冲击数据库,造成巨大压力。常见于高并发场景,如热门商品信息失效时。解决方法包括设置热点key永不过期、使用分布式锁、预热数据、熔断降级等,以保障系统稳定性。

在计算机系统(尤其是分布式系统)中,缓存击穿是一种常见的缓存异常现象,指的是一个频繁访问的热点缓存key突然失效(过期或被删除),导致大量并发请求瞬间绕过缓存,直接冲击数据库,造成数据库压力骤增,甚至可能引发数据库宕机的情况。

缓存击穿的核心特点

  1. 目标是热点key:被击穿的缓存key通常是高并发场景下的“热点数据”(如热门商品详情、秒杀活动信息等),访问频率极高。
  2. 缓存突然失效:可能是缓存key自然过期(如设置了较短的TTL),或被主动删除(如数据更新时误操作)。
  3. 并发请求“穿透”缓存:缓存失效后,大量并发请求无法从缓存中获取数据,只能直接查询数据库,形成“流量冲击”。

举个例子理解

假设某电商平台的“爆款手机”商品详情页,缓存key为product:10086,设置了1小时过期。当缓存过期的瞬间:

  • 恰好有1000个用户同时访问该商品页;
  • 所有请求都发现缓存中没有数据(key已失效);
  • 1000个请求同时涌向数据库查询商品信息;
  • 数据库可能因瞬间压力过大而响应缓慢,甚至崩溃。

与其他缓存问题的区别

为了更清晰理解,对比另外两种常见缓存异常:

问题类型 核心原因 区别点
缓存击穿 热点key失效,大量并发请求冲击数据库 针对单个热点key,因失效引发集中访问
缓存穿透 请求查询不存在的数据(缓存和数据库都没有) 针对不存在的key,请求持续穿透到数据库
缓存雪崩 大量缓存key同时失效,引发数据库整体压力 针对多个key批量失效,范围更广

如何解决缓存击穿?

核心思路是避免缓存失效后大量请求同时访问数据库,常见方案包括:

  1. 设置热点key永不过期
    手动管理缓存生命周期,不设置TTL(过期时间),通过业务逻辑主动更新缓存(如商品信息变更时同步更新缓存),从根源避免失效。

  2. 互斥锁(分布式锁)
    当缓存失效时,只允许一个请求获取锁并查询数据库,其他请求等待该请求更新缓存后再从缓存中获取数据。

    • 流程:请求发现缓存失效 → 尝试获取锁 → 获锁成功:查库并更新缓存 → 获锁失败:等待一段时间后重试(从缓存获取)。
    • 工具:可通过Redis的SETNX、ZooKeeper等实现分布式锁。
  3. 预热热点数据
    在缓存过期前,主动触发查询并更新缓存(如定时任务提前刷新热点key),避免“突然失效”的空窗期。

  4. 熔断降级
    当数据库压力过大时,临时返回缓存中的旧数据(即使已过期)或默认值,避免数据库被压垮,待压力缓解后再更新缓存。

通过上述方案,可以有效降低缓存击穿的风险,保障系统在高并发场景下的稳定性。

目录
相关文章
|
2月前
|
缓存 数据库连接 数据库
缓存三剑客(穿透、击穿、雪崩)
缓存穿透指查询数据库和缓存中都不存在的数据,导致请求直接冲击数据库。解决方案包括缓存空对象和布隆过滤器。缓存击穿是大量请求访问同一个失效的热点数据,使数据库瞬间压力剧增,解决方法有提前预热、设置永不过期、加锁限流等。缓存雪崩是大量key同时失效,导致所有请求直达数据库,可通过引入随机过期时间缓解。三者分别对应单点爆破、全面崩塌等问题,需根据场景选择合适策略优化系统性能与稳定性。
175 0
|
2月前
|
存储 缓存 NoSQL
如何解决缓存击穿?
缓存击穿是指热点数据失效时大量请求直接冲击数据库,可能导致系统崩溃。解决方案包括:永不过期策略避免缓存失效瞬间的穿透;互斥锁控制并发访问;热点预热提前刷新缓存;熔断降级在数据库压力大时返回默认值;二级缓存降低Redis压力。实际中常组合使用多种方案,如热点预热+互斥锁+熔断降级,以提升系统稳定性与性能。
288 0
|
1月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
160 0
|
6月前
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
1117 29
|
11月前
|
存储 缓存 监控
缓存击穿、缓存穿透、缓存雪崩 3大问题,如何彻底解决?
【10月更文挑战第8天】在分布式系统中,缓存的使用极大地提高了系统的性能和响应速度。然而,缓存击穿、缓存穿透和缓存雪崩是三个常见的缓存相关问题,它们可能导致系统性能下降,甚至引发系统崩溃。本文将深入探讨这三个问题的成因、影响以及彻底的解决方案。
1248 1
|
11月前
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
637 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
6月前
|
缓存 数据库
什么是缓存击穿 ? 怎么解决 ?
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大 解决方案 : ● 热点数据提前预热 ● 设置热点数据永远不过期。 ● 加锁 , 限流
|
10月前
|
缓存 NoSQL 数据库
缓存穿透、缓存击穿和缓存雪崩及其解决方案
在现代应用中,缓存是提升性能的关键技术之一。然而,缓存系统也可能遇到一系列问题,如缓存穿透、缓存击穿和缓存雪崩。这些问题可能导致数据库压力过大,甚至系统崩溃。本文将探讨这些问题及其解决方案。
|
11月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
172 2