一、一个贯穿计算机系统的通用思想
如果你仔细观察计算机系统中的各种优化手段,会发现一个反复出现的模式:
把操作中「不可复用的大块」,拆成粒度合适的「可复用小块」,将频繁使用的小块缓存起来供后续请求命中复用。
这个模式出现在太多看似不相干的领域中:
大文件分片存储 → 内容寻址分片去重,相同内容的片只存一份
AI推理中的前缀缓存 → 跨请求复用公共Prompt的KV Cache
Git版本控制 → 内容寻址存储,相同内容的Blob只存一份
Docker镜像 → 分层复用,基础层被多个容器共享
CPU缓存 → Cache Line按块加载,利用空间局部性
CDN加速 → 静态资源分片缓存到边缘节点
它们背后是同一个思想:拆分 + 缓存 + 复用。
二、两个典型案例
案例一:大文件存储中的分片去重
传统的文件存储方式中,每个文件作为一个完整对象保存。如果系统中存在大量相似或重复的文件(例如多个用户上传同一份安装包、多份文档包含相同的图片素材),每个文件都会完整占用一份存储空间,造成巨大的浪费。
分片去重存储的思路是:
拆分:将文件按固定大小(如4MB)切成若干个分片(Chunk)
指纹计算:对每个分片计算哈希值(如SHA-256),作为该分片的唯一标识
去重存储:系统中相同哈希值的分片只存一份,不同文件通过分片引用列表来组合
按需还原:读取文件时,根据引用列表从存储中取出各个分片,组装成完整文件
举个例子:假设有两份PDF文档,前80%的内容完全相同(包含相同的封面、目录、引言),只有后20%不同。传统存储需要存两份完整的100MB文件,总共200MB。而分片去重存储只需存一份80MB的公共分片,再加上两份20MB的差异化分片,总共120MB,节省了40%的存储空间。
案例二:AI推理中的前缀缓存
大模型推理分为两个阶段:
Prefill(预填充):读取完整Prompt,并行计算所有token的Key/Value,存入KV Cache
Decode(生成):基于KV Cache,逐个token自回归生成回答
在实际应用中,大量请求携带相同的System Prompt、工具定义或Few-shot示例。如果每次都对这部分重复做Prefill计算,会造成巨大的算力浪费。
前缀缓存的思路是:
将Prompt按固定长度切分为Block
每个Block计算Hash,建立哈希链
新请求到来时,按前缀匹配已有的KV Block
命中的Block直接复用,只对未命中部分做Prefill计算
这与分片存储异曲同工:把不可复用的大块(完整Prompt)拆成可复用的小块(KV Block),将热小块缓存起来供后续请求复用。
三、为什么这个模式如此强大?
缓存之所以成为性价比最高的优化手段,核心原因是计算机系统中普遍存在的80/20法则(帕累托分布):
80%的请求访问20%的热点数据
电商平台中,20%的商品承担80%的下单量
软件系统中,20%的代码路径消耗80%的CPU时间
LLM推理中,绝大多数请求共享同一份System Prompt
这种不均匀性意味着:只要针对那20%的热数据进行缓存,就能覆盖80%的访问量。
剩下的80%冷数据虽然量大,但访问频率低,放在慢速介质中也不会造成明显瓶颈。
于是系统的设计原则变得清晰:
数据类型 | 访问频率 | 存放位置 | 介质特性 |
|---|---|---|---|
热数据(20%) | 高 | 快速介质(内存/显存) | 快、贵 |
冷数据(80%) | 低 | 慢速介质(磁盘/网络) | 慢、便宜 |
缓存做的就是:识别热小块 → 放在快的地方 → 按需命中复用。
四、更深一层的启发
从这个思想出发,我们可以提炼出几条通用的系统设计原则:
1. 拆分是复用的前提
不拆分,就无法精细化管理。大块数据要么全命中要么全错过,缺乏灵活性。拆分后,可以做到部分命中、部分复用。
2. 粒度决定效率上限
分得太粗,复用率低;分得太细,管理开销大。找到合适的粒度是缓存设计的关键。
3. 热点是会变化的
今天的System Prompt明天可能换掉,今天的爆款商品下周可能无人问津。缓存需要配合淘汰策略(LRU、TTL等)动态适应。
4. 不均匀性是朋友,不是敌人
很多人在面对性能问题时本能地想要"平均分摊",但真正高效的架构恰恰是利用不均匀性——把资源倾斜给那20%的热点,换取80%的效率提升。
五、写在最后
回到最初的那个观察:
大文件分片存储 和 AI前缀缓存,本质上是同一个思想。
它们教会我们的不止是两个具体技术,而是一种思维方式:
遇到性能问题时,第一反应不是加机器,而是问自己三个问题:
哪些操作是高耗时的?(定位瓶颈)
这些操作中有没有可复用的部分?(识别热点)
如何拆分才能让复用粒度最优?(设计缓存)
这个思维习惯,比任何一个具体技术的价值都要长久。
本文源自日常学习中的一次顿悟,记录于2026年6月16日。