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

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

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

缓存穿透的原因主要有:

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

缓存穿透的危害包括:

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

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

策略一:缓存空值

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

策略二:布隆过滤器

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

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

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

策略四:请求限流与熔断

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

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

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

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

相关文章
|
26天前
|
缓存 监控 NoSQL
redis 缓存穿透 击穿 雪崩 的原因及解决方法
redis 缓存穿透 击穿 雪崩 的原因及解决方法
|
2天前
|
存储 缓存 NoSQL
SpringBoot配置第三方专业缓存技术Redis
SpringBoot配置第三方专业缓存技术Redis
9 4
|
2天前
|
缓存 监控 NoSQL
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
6 1
|
2天前
|
存储 缓存 监控
SpringBoot配置第三方专业缓存技术Ehcache
SpringBoot配置第三方专业缓存技术Ehcache
8 1
|
7天前
|
存储 缓存 NoSQL
SpringBoot实用开发篇第四章(整合缓存技术)
SpringBoot实用开发篇第四章(整合缓存技术)
|
17天前
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
22 3
|
1月前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
【5月更文挑战第16天】该方案提出了解决Redis缓存穿透、击穿和雪崩问题的策略。通过使用两个或多个互为备份的Redis集群,确保在单个集群故障时,另一个可以接管。在故障发生时,业务会与备用集群保持心跳检测,并根据业务重要性分批转移流量,逐步增加对备用集群的依赖,同时监控系统稳定性。对于成本敏感的小型公司,可以采用低成本的单机或小规模自建Redis备份。此方案强调渐进式流量转移,以保护系统免受突然压力冲击。
31 1
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
|
2天前
|
存储 缓存 NoSQL
SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案
SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案
4 0
|
2天前
|
缓存 Java Spring
SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 2024年5000字详解
SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 2024年5000字详解
5 0
|
1月前
|
存储 缓存 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透
【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。
30 3