软件体系结构 - 缓存技术(9)缓存穿透

简介: 【4月更文挑战第20天】软件体系结构 - 缓存技术(9)缓存穿透

缓存穿透是指在高并发场景下,客户端请求的某个数据在缓存中不存在,且在后端数据库中也不存在。由于缓存通常在未命中时才去数据库查询,对于这类请求,缓存无法起到拦截作用,导致大量请求直接打到数据库,形成“穿透”现象。这种现象会给数据库带来不必要的压力,尤其是当请求的键是恶意构造或大量不存在的键时,可能会对数据库造成严重的冲击。

缓存穿透的原因主要有:

  1. 正常查询不存在的数据:在实际业务中,用户或应用程序可能会请求一些确实不存在于数据库中的数据。如果这些请求量较大,且没有适当的缓存处理机制,就会导致缓存穿透。
  2. 恶意攻击:攻击者故意制造大量不存在的查询请求,企图使缓存失效并直接冲击数据库,这种攻击通常被称为“缓存击穿攻击”。

缓存穿透的危害包括:

  • 数据库压力剧增:大量无效请求直接到达数据库,可能使数据库成为性能瓶颈,影响其对其他合法请求的响应能力。
  • 系统响应延迟:数据库处理大量无效请求导致响应时间延长,影响整体系统的响应速度和用户体验。
  • 资源浪费:数据库资源被无效请求占用,可能导致真正需要服务的请求无法得到及时处理,浪费系统资源。

为防止和缓解缓存穿透,可以采用以下策略:

策略一:缓存空值

  • 对于查询结果为null或不存在的数据,依然将其以特定标记(如特殊值或空对象)存入缓存,设定较短的过期时间。这样,后续同样的无效请求就可以直接从缓存中获取结果,避免穿透到数据库。

策略二:布隆过滤器

  • 使用布隆过滤器(Bloom Filter)对可能存在的数据进行预判。布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否“可能”存在于一个集合中。在请求到达缓存之前,先通过布隆过滤器检查该键是否可能存在。如果布隆过滤器判断该键不存在,则直接返回,避免对数据库的无效查询。

策略三:白名单/黑名单机制

  • 对于已知的合法请求或恶意请求,建立白名单或黑名单。白名单允许通过的请求直接访问缓存和数据库,黑名单则阻止恶意请求到达数据库。这种方式需要结合业务逻辑和风控系统进行实时更新和维护。

策略四:请求限流与熔断

  • 对于短时间内大量相同或相似请求,使用限流组件限制其访问速率,或者在检测到异常流量时启动熔断机制,暂时拒绝部分请求,保护数据库免受冲击。

策略五:后台预加载或定时刷新

  • 对于特定业务场景,可以提前预加载或定时刷新可能被频繁访问但不存在于缓存和数据库的数据,填充空值缓存,防止穿透。

综上所述,通过合理的缓存策略、防御性编程以及风险控制手段,可以有效防止和缓解缓存穿透现象,保护数据库免受无效请求的冲击,确保系统的稳定性和性能。在实际应用中,往往需要结合业务特性和系统资源状况,综合运用多种策略来应对缓存穿透问题。

相关文章
|
2月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
5天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
19 2
|
5天前
|
缓存 NoSQL Redis
解决 Redis 缓存穿透问题的有效方法
解决 Redis 缓存穿透问题的有效方法
17 2
|
8天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
14 1
|
2月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
5天前
|
缓存 NoSQL 前端开发
16)缓存雪崩、缓存击穿、缓存穿透
16)缓存雪崩、缓存击穿、缓存穿透
13 0
|
1月前
|
存储 缓存 前端开发
缓存技术在软件开发中的应用与优化策略
缓存技术在软件开发中的应用与优化策略
|
2月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
354 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
2月前
|
缓存 数据库
缓存穿透和击穿
【8月更文挑战第16天】
35 0
缓存穿透和击穿
|
2月前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。