ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

系统设计实战:五大缓存策略详解——Cache Aside、Read Through、Write Through、Write Around 与 Write Back

系统设计实战:五大缓存策略详解——Cache Aside、Read Through、Write Through、Write Around 与 Write Back 后端文档教程【免费下载链接】system-design-101Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.项目地址https://gitcode.com/GitHub_Trending/sy/system-design-101点击查看免费下载在引入缓存之后缓存与数据库之间的数据同步就成了架构中不可回避的问题。本文基于 system-design-101 项目中的 top-5-caching-strategies.md 一文深入讲解五大缓存读写策略的原理、适用场景、组合方式与代码级落地细节。读完本文你将能够针对不同读写负载选择正确的缓存策略并在真实系统中通过组合策略保证缓存与数据库的一致性。为什么需要缓存策略同步问题从何而来缓存的本质是以空间换时间把热数据放在更快的存储介质如内存中减少对慢速存储如数据库磁盘的访问。但缓存不是数据库的镜像而是一份独立维护的副本因此当数据库中的数据发生变化时缓存与数据库之间就会出现数据不一致的窗口。这一点正如 how-do-we-manage-data.md 中所总结的缓存相关模式如 Cache Aside的价值正是在于读多写少场景下大幅降低数据库压力。要让缓存真正生效就必须明确回答三个问题读路径读请求先查哪里未命中时谁来负责回源写路径写请求先写哪里缓存如何失效或更新组合方式读写策略如何搭配才能把同步成本降到最低本项目的 top-5-caching-strategies.md 将答案归纳为 5 种策略Cache Aside、Read Through、Write Around、Write Back、Write Through并强调策略通常组合使用。读策略Read Strategies读策略解决的是读请求如何利用缓存的问题。一个读请求到达时应用首先要决定是自己在业务代码里管理缓存还是把回源、填充缓存的职责交给缓存系统本身。Cache Aside旁路缓存Cache Aside 是业界最常用、也是最直观的读策略其核心思想是应用负责管理缓存缓存系统本身不感知业务逻辑。它的读流程如下应用收到读请求先查询缓存缓存命中直接返回缓存数据流程结束缓存未命中应用自己回源查询数据库将数据库返回的数据写入缓存再返回给调用方。这一模式的适用前提在 how-do-we-manage-data.md 中有明确描述数据读取频繁、更新较少的场景。其优势在于实现简单、可控性强应用可以针对不同业务数据定制不同的过期时间与填充策略缺点则是缓存维护逻辑散落在业务代码中每个需要缓存的服务都要自己写查缓存、未命中回源、回填这段样板代码。Cache Aside 读流程可用伪代码表达def read(key): data cache.get(key) if data is None: # 缓存未命中 data db.query(key) # 回源数据库 cache.set(key, data) # 回填缓存 return dataRead Through读穿透Read Through 与 Cache Aside 的唯一区别在于缓存系统自身承担了未命中时回源并回填的职责。应用只向缓存发起读请求缓存未命中时由缓存组件内部的加载器Loader自动从数据库加载数据并写回缓存应用无需关心底层细节。这相当于把 Cache Aside 的查缓存 回源 回填三步封装进了缓存层内部。Read Through 的优点是把缓存逻辑从业务代码中剥离出来业务侧只需一行读取调用代价则是应用对缓存行为例如回源时机、并发回源控制的掌控力变弱通常依赖缓存中间件如 Redis、Memcached的扩展能力来实现。写策略Write Strategies写策略解决的是写请求如何维护缓存一致性的问题。三种写策略的核心差异在于写操作发生时是先写数据库还是先写缓存以及是否同步写缓存。Write Through写穿透Write Through 策略要求写请求先更新数据库再同步更新缓存或反过来先更新缓存再更新数据库两者都保持同步写入。其核心特征是写路径与读路径串行同步写入数据库和更新缓存必须同时完成从而保证缓存与数据库始终一致。这一策略的典型组合方式是与 Read Through 搭配写时同步穿透更新缓存读时缓存穿透回源整个系统的数据一致性最强。代价也很明显每次写操作都要写两次数据库 缓存写延迟上升写吞吐下降。它适合写多读少、对一致性要求高的场景因为此时缓存命中率低同步写缓存反而浪费而如果系统读多写少同步更新缓存则能换来较高的命中收益。Write Around绕写缓存Write Around 策略的思路是写请求只写数据库绕过缓存让缓存中的数据通过过期TTL或后续的失效机制自然更新。它的优势是写路径最短、写延迟最低也不会像 Write Through 那样浪费写吞吐去更新一个可能不会被读到的缓存项。缺点则是缓存与数据库之间存在一定时间的不一致窗口——在缓存过期之前读到的是旧数据。本项目的 top-5-caching-strategies.md 特别指出Write Around 经常与 Cache Aside 搭配使用。原因在于 Cache Aside 的读路径在缓存未命中时会自动回源数据库并回填缓存因此即使写操作绕过了缓存只要缓存项被淘汰或过期下一次读请求就会拉到最新数据缓存自然恢复一致。这种组合非常适合读多写少、允许短暂延迟一致性的业务如用户资料、商品详情页。Write Back写回/延迟写Write Back 策略是三种写策略中异步化程度最高的一种写请求只更新缓存缓存层异步地把数据批量刷回数据库。其核心价值在于写吞吐极高写请求只落在内存缓存上不阻塞在数据库 IO批量合并同一份数据的多次修改可以在刷回前合并显著减少数据库写入次数适合写密集、可容忍数据丢失风险的场景如日志聚合、计数统计、社交动态点赞数等。代价则是风险面更大一旦缓存节点在异步刷回前宕机尚未落盘的数据就会丢失同时缓存与数据库之间的一致性窗口可能比 Write Around 更长。因此生产环境使用 Write Back 时必须配套持久化如 Redis AOF/RDB 快照与容错机制。策略组合真实的系统从来不是只用一种策略本项目的 top-5-caching-strategies.md 在结尾明确强调这五种策略经常组合使用并给出了最典型的一对组合——Write Around Cache Aside。为什么这两者天然契合因为二者的分工恰好互补写路径Write Around 只写数据库写延迟最低读路径Cache Aside 在缓存未命中时自动回源回填保证下一次读能拿到新数据同步闭环缓存项被淘汰或过期后Cache Aside 的回填逻辑自动把数据库中的新数据重新加载进缓存。这套组合在读多写少、允许短暂不一致的系统里是最经典的架构形态例如用户信息、商品详情等场景。而如果业务对一致性要求极高则倾向Write Through Read Through的全同步组合如果写密集且允许异步则倾向Write Back配合缓存持久化。下表汇总了五种策略的关键差异方便面试与架构选型时快速对照策略写路径读路径写延迟一致性典型组合Cache Aside由业务代码管理缓存应用查缓存未命中回源回填低由写策略决定常与 Write Around 搭配Read Through—缓存组件自动回源回填低由写策略决定常与 Write Through 搭配Write Through同步写数据库 缓存缓存命中即可高最强同步常与 Read Through 搭配Write Around只写数据库绕过缓存命中旧缓存过期后更新最低弱短暂不一致常与 Cache Aside 搭配Write Back只写缓存异步刷库缓存命中即可最低异步最弱需持久化兜底配合缓存持久化使用策略落地的关键失效、淘汰与同步兜底选择策略只是第一步落地时还需要配合三件套失效TTL、淘汰Eviction与回源兜底。TTL 失效与淘汰算法本项目的 top-8-cache-eviction-strategies.md 与 most-popular-cache-eviction.md 对缓存淘汰算法做了系统性梳理TTL给每个缓存项设置固定生命周期到点即失效。实现简单是多数系统的默认兜底策略适合会话信息等只在某段时间内有效的数据LRU最近最少使用淘汰最久未被访问的项适合具有时间局部性的访问模式LFU最不经常使用淘汰访问频次最低的项适合少数热点数据被反复访问的场景但需要维护访问计数MRU最近最常使用反向淘汰最近访问的项适用于流式/批处理等刚访问过就不再需要的场景FIFO先进先出按插入顺序淘汰最老条目实现最简单但不考虑访问热度。失效与回源兜底即便策略选得再正确缓存系统依然可能出问题。本项目的 how-can-cache-systems-go-wrong.md 总结了四大典型故障及其缓解手段这些正是策略落地环节必须考虑的兜底设计惊群效应Thunder Herd大量 key 同时过期导致请求瞬间全部打向数据库。缓解方式给 key 的过期时间加随机抖动避免同一时刻集中过期或限制只有核心业务数据可以穿透访问数据库缓存穿透Cache Penetration查询的 key 在缓存和数据库中都不存在导致每次查询都穿透到数据库。缓解方式对不存在的 key 缓存空值或用布隆过滤器在访问前做存在性预检缓存击穿Cache Breakdown某个热点 key 过期瞬间大量请求直接打向数据库。由于热点 key 往往占查询量的 80%通常做法是热点 key 不设置过期时间缓存雪崩/宕机Cache Crash缓存节点整体不可用所有请求直达数据库。缓解方式引入熔断器缓存不可用时直接熔断保护数据库或为缓存部署集群提升可用性。在选型与评估时还可参考 things-to-consider-when-using-cache.md 给出的关键指标缓存命中率Cache Hit Ratio、延迟Latency、吞吐Throughput、失效速率Invalidation Rate、内存/CPU/网络占用以及冷启动阶段的惊群问题。小结读策略Cache Aside应用管缓存命中即返未命中回源回填与 Read Through缓存组件自动回源二选一写策略Write Through同步双写一致性最强、Write Around只写库绕过缓存写延迟最低、Write Back只写缓存异步刷库写吞吐最高三选一组合原则读多写少、允许短暂不一致 →Write Around Cache Aside本项目文档给出的经典组合一致性要求高 →Write Through Read Through写密集可异步 →Write Back 持久化兜底落地配套必须同时设计好 TTL 失效、淘汰算法与防穿透/防惊群/防击穿/防雪崩的兜底机制否则再好的策略也会在极端流量下失效。想要进一步深入可以在本仓库中继续阅读 top-8-cache-eviction-strategies.md、how-can-cache-systems-go-wrong.md、things-to-consider-when-using-cache.md 与 how-can-redis-be-used.md构建完整的缓存知识体系。赞分享后端文档教程【免费下载链接】system-design-101Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.项目地址https://gitcode.com/GitHub_Trending/sy/system-design-101点击查看免费下载相关推荐RtspClientSharp高级教程TCP与UDP传输模式切换及性能优化技巧RtspClientSharp高级教程TCP与UDP传输模式切换及性能优化技巧 RtspClientSharp是一款纯C 编写的RTSP客户端库专为.NETGitHub_Trending/ha/Hacktoberfest2023项目后端缓存设计模式Cache-Aside与Write-ThroughGitHub_Trending/ha/Hacktoberfest2023项目后端缓存设计模式Cache Aside与Write Through 在软件开发中Flambe数学库详解FMath、Matrix和Point在游戏开发中的应用Flambe数学库详解FMath、Matrix和Point在游戏开发中的应用 Flambe是一款专注于快速开发跨平台游戏的框架支持HTML5、Flash、A创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表