首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
35 | 流量控制:高并发系统中我们如何操纵流量?
36 | 面试现场第三期:你要如何准备一场技术面试呢?
37 | 计数系统设计(一):面对海量数据的计数器要如何做?
38 | 计数系统设计(二):50万QPS下如何设计未读数系统?
39 | 信息流设计(一):通用信息流系统的推模式要如何做?
40 | 信息流设计(二):通用信息流系统的拉模式要如何做?
当前位置:
首页>>
技术小册>>
高并发系统设计核心
小册名称:高并发系统设计核心
### 15 | 缓存的使用姿势(三):缓存穿透了怎么办? 在构建高并发系统时,缓存作为提升系统性能、减轻数据库压力的关键技术之一,其重要性不言而喻。然而,缓存的使用并非毫无风险,其中“缓存穿透”便是开发者需要重点防范的问题之一。缓存穿透,指的是大量请求直接穿透缓存层,到达数据库层,而这些请求往往是无效或恶意的,它们所查询的数据在缓存中不存在,从而导致数据库层承受巨大压力,甚至引发数据库宕机。本章节将深入探讨缓存穿透的成因、危害、检测方法及多种应对策略。 #### 一、缓存穿透的成因 1. **数据不存在**:最常见的情况是,用户请求的数据在数据库中本身就不存在,比如查询一个不存在的用户ID或商品编号。由于缓存中没有这些数据的副本,每次请求都会穿透到数据库层。 2. **恶意攻击**:攻击者可能故意构造大量不存在的数据请求,意图消耗服务器资源,造成拒绝服务(DoS)攻击。 3. **缓存过期或失效**:在某些情况下,缓存中的数据可能因过期或被错误地删除,而新的请求又未能及时在缓存中填充有效数据,导致请求直接到达数据库。 4. **配置错误**:缓存策略或配置不当,如缓存层未开启或缓存键设计不合理,也可能导致缓存无法正常工作,从而引发缓存穿透。 #### 二、缓存穿透的危害 1. **数据库压力增大**:无效的请求频繁访问数据库,导致数据库负载急剧上升,影响正常业务处理。 2. **系统性能下降**:数据库处理速度远不及缓存,大量请求直接冲击数据库会显著降低系统响应速度。 3. **资源浪费**:无效的请求占用了服务器和网络资源,降低了系统的整体效率。 4. **安全风险**:恶意攻击可能通过缓存穿透进一步实施更严重的攻击,如SQL注入、数据篡改等。 #### 三、缓存穿透的检测 1. **监控数据库访问日志**:分析数据库访问日志,识别出频繁访问且查询结果为空或错误的数据请求。 2. **系统性能监控**:通过系统性能监控工具,观察缓存命中率、数据库负载等指标,及时发现缓存穿透的迹象。 3. **异常流量分析**:利用网络流量分析工具,分析请求来源、请求频率等特征,识别出可能的恶意攻击流量。 #### 四、缓存穿透的应对策略 ##### 4.1 布隆过滤器(Bloom Filter) 布隆过滤器是一种空间效率很高的概率型数据结构,用于判断一个元素是否在一个集合中。它允许存在一定的误判率,但绝不会出现漏判(即如果某个元素不在集合中,布隆过滤器绝对能判断出来)。将布隆过滤器部署在缓存之前,对所有请求进行过滤,如果请求的数据在布隆过滤器中不存在,则直接返回空结果或错误信息,不再访问数据库。这种方法可以有效防止缓存穿透攻击,但需注意误判率的控制。 ##### 4.2 缓存空值或默认值 对于不存在的数据,可以在缓存中存储一个空值或默认值,并设置较短的过期时间。当请求到达时,首先检查缓存,如果缓存中存在空值或默认值,则直接返回,不再访问数据库。这种方法虽然能减少数据库压力,但会增加缓存的存储成本,并可能导致一定的延迟。 ##### 4.3 访问频率限制 对于频繁访问不存在数据的IP或用户,实施访问频率限制。当达到设定的阈值时,暂时禁止该IP或用户的访问,或要求通过验证码验证身份。这种方法可以有效防止恶意攻击,但也可能误伤正常用户。 ##### 4.4 数据预热 在系统上线前或低峰时段,预先将热点数据加载到缓存中,减少系统运行时对数据库的依赖。虽然数据预热不能直接解决缓存穿透问题,但能提高系统的整体性能和缓存命中率,间接降低缓存穿透的风险。 ##### 4.5 改进缓存策略 - **合理设计缓存键**:确保缓存键的唯一性和有效性,避免因缓存键设计不当导致的缓存失效。 - **设置缓存过期策略**:根据业务需求和数据变化频率,合理设置缓存的过期时间,避免缓存过期导致的缓存穿透。 - **使用多级缓存**:在系统中引入多级缓存机制,如本地缓存、分布式缓存等,提高缓存的命中率和可用性。 ##### 4.6 监控与预警 建立完善的监控系统,实时监控缓存命中率、数据库负载等关键指标,一旦发现异常立即发出预警,以便及时采取措施应对。 #### 五、总结 缓存穿透是高并发系统设计中不可忽视的问题,它直接威胁到系统的稳定性和性能。通过合理的缓存策略、使用布隆过滤器、缓存空值、限制访问频率、数据预热以及加强监控与预警等措施,可以有效防范和应对缓存穿透问题。在实际应用中,应根据业务需求和系统特点,综合采用多种策略,形成一套完善的缓存保护机制,确保系统的稳定运行。同时,随着技术的发展和业务的变化,缓存策略也需要不断优化和调整,以适应新的挑战和需求。
上一篇:
14 | 缓存的使用姿势(二):缓存如何做到高可用?
下一篇:
16 | CDN:静态资源如何加速?
该分类下的相关小册推荐:
etcd基础入门与实战
云计算那些事儿:从IaaS到PaaS进阶(四)
云计算那些事儿:从IaaS到PaaS进阶(一)
构建可视化数据分析系统-ELK
Linux常用服务器部署实战
CI和CD代码管理平台实战
云计算那些事儿:从IaaS到PaaS进阶(三)
从 0 开始学架构
Web服务器Tomcat详解
分布式技术原理与算法解析
Linux云计算网站集群之nginx核心
RocketMQ入门与实践