首页
技术小册
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 | 信息流设计(二):通用信息流系统的拉模式要如何做?
当前位置:
首页>>
技术小册>>
高并发系统设计核心
小册名称:高并发系统设计核心
### 13 | 缓存的使用姿势(一):如何选择缓存的读写策略? 在构建高并发系统时,缓存作为提升系统性能、降低数据库压力的关键技术之一,其设计与实现策略尤为重要。本章节将深入探讨缓存的读写策略选择,帮助读者理解在不同场景下如何优化缓存的使用,以达到最佳的性能与成本效益比。 #### 引言 缓存系统通过存储数据的临时副本于访问速度更快的介质(如内存、SSD等)上,减少了直接访问慢速数据源(如数据库、硬盘)的次数,从而显著提升数据访问速度。然而,缓存的引入也带来了数据一致性、缓存击穿、雪崩效应等挑战。因此,合理选择缓存的读写策略,是确保缓存系统高效稳定运行的关键。 #### 缓存读写策略概述 缓存的读写策略主要围绕“何时读缓存”、“何时写缓存”以及“如何处理缓存与数据源之间的数据同步”等问题展开。常见的缓存读写策略包括: 1. **Cache-Aside Pattern(旁路缓存模式)** 2. **Read-Through(穿透读取)** 3. **Write-Through(写直达)** 4. **Write-Behind(写回)** 5. **Write-Around(旁路写)** 每种策略都有其适用场景和优缺点,下面将逐一详细分析。 #### 1. Cache-Aside Pattern(旁路缓存模式) **概述**: Cache-Aside Pattern 是最常用的缓存读写策略之一,其核心思想是“应用层控制缓存”。即,应用代码在读取数据时首先尝试从缓存中获取,如果缓存未命中,则从数据库等数据源中读取数据,并将数据放入缓存中以供后续访问。写入数据时,则先更新数据源,然后失效缓存中的对应项或更新缓存数据(取决于业务需求)。 **优点**: - 灵活性强:缓存逻辑完全由应用控制,便于根据业务场景调整。 - 易于实现:适用于大多数编程语言和环境,无需修改缓存中间件或数据库的代码。 - 易于扩展:可以根据需要选择多种缓存存储介质和策略。 **缺点**: - 数据一致性问题:需要应用层确保缓存与数据源之间的一致性,可能出现短暂的数据不一致。 - 缓存击穿与雪崩效应:高并发下,如果大量请求同时访问未缓存的数据,可能导致数据库压力骤增,甚至引发缓存雪崩。 **适用场景**: 适用于读多写少、数据一致性要求不是特别严格的场景,如电商网站的商品详情页访问。 #### 2. Read-Through(穿透读取) **概述**: Read-Through 模式下,缓存中间件负责读取缓存和从数据源加载数据到缓存的逻辑。当缓存未命中时,缓存中间件会自动从数据源加载数据,并将其存储到缓存中,然后返回给客户端。这种模式简化了应用层的代码,使得应用无需直接处理缓存未命中的情况。 **优点**: - 简化应用逻辑:应用层无需处理缓存未命中的情况,减少了代码复杂性。 - 提高数据访问效率:缓存中间件优化了数据读取流程,减少了数据访问延迟。 **缺点**: - 缓存中间件复杂性增加:需要缓存中间件支持Read-Through功能。 - 数据一致性问题依然存在:依赖于缓存中间件与数据源之间的同步机制。 **适用场景**: 适用于对应用层代码复杂度有较高要求,且希望减少缓存逻辑侵入应用层的场景。 #### 3. Write-Through(写直达) **概述**: Write-Through 模式下,每次数据更新操作都会同时同步到缓存和数据源中。这种策略确保了缓存与数据源之间数据的一致性,但可能牺牲了一定的写操作性能。 **优点**: - 数据一致性高:每次数据更新都会同时更新缓存和数据源,保证了数据的高度一致性。 **缺点**: - 写入性能较低:由于每次写入都需要同时操作缓存和数据源,因此写入性能可能受到影响。 - 缓存利用率可能不高:如果数据更新频繁,但读取不频繁,则缓存中的数据可能很快失效,导致缓存利用率下降。 **适用场景**: 适用于对数据一致性要求极高的场景,如金融交易系统。 #### 4. Write-Behind(写回) **概述**: Write-Behind(也称为Write-Back)模式下,数据更新操作首先只写入缓存,缓存中间件异步地将更新操作批量写入到数据源中。这种方式提高了写操作的性能,但可能牺牲了一定的数据一致性。 **优点**: - 写入性能高:由于写操作只需更新缓存,因此写入速度较快。 - 批量写入减少数据库压力:缓存中间件可以批量处理写回操作,减少对数据库的冲击。 **缺点**: - 数据一致性风险:在缓存中的数据还未同步到数据源之前,如果缓存系统发生故障,可能导致数据丢失或不一致。 - 实现复杂度高:需要处理缓存与数据源之间的异步同步逻辑,以及可能的冲突解决策略。 **适用场景**: 适用于写多读少、对写操作性能要求较高的场景,如社交媒体的用户状态更新。 #### 5. Write-Around(旁路写) **概述**: Write-Around 模式下,数据更新操作绕过缓存直接写入数据源。这种策略下,缓存不参与写操作,只在读操作时起作用。 **优点**: - 写入性能高:由于写操作不经过缓存,因此写入速度快。 - 实现简单:无需处理缓存与数据源之间的同步逻辑。 **缺点**: - 数据一致性风险高:由于缓存中的数据可能不是最新的,因此存在数据不一致的风险。 - 缓存利用率低:频繁更新的数据可能频繁失效,导致缓存命中率下降。 **适用场景**: 适用于数据更新极其频繁,且读操作对实时性要求不高的场景。 #### 总结 选择合适的缓存读写策略,需要根据具体业务场景、数据一致性要求、系统性能需求等多方面因素综合考虑。Cache-Aside Pattern 因其灵活性和易实现性,在多数场景下是首选;而Read-Through、Write-Through、Write-Behind、Write-Around等策略则适用于特定场景下的优化需求。在实际应用中,还可以结合多种策略,形成混合缓存策略,以更好地满足系统需求。此外,还需要关注缓存的失效策略、数据一致性保障机制等方面的设计,以确保缓存系统的稳定高效运行。
上一篇:
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
下一篇:
14 | 缓存的使用姿势(二):缓存如何做到高可用?
该分类下的相关小册推荐:
深入浅出分布式技术原理
从 0 开始学架构
Web大并发集群部署
大规模数据处理实战
云计算那些事儿:从IaaS到PaaS进阶(一)
Docker容器实战部署
Linux常用服务器部署实战
Web安全攻防实战(上)
系统性能调优必知必会
Redis数据库高级实战
分布式技术原理与算法解析
DevOps开发运维实战