立即下载 知乎日报 每日提供高质量新闻资讯

看过这两张图,就明白电脑里的「缓存」是什么意思

图片:Yestone.com 版权图片库

Cache 和 Buffer 都是缓存,主要区别是什么?

沈万马,知乎「知乎老抽 Club」创始人

俩英文单词,不先看看本义吗?虽然都是抽象单词,但在各个地方都有具象的应用。

Buffer 常见的是这个:

(来源:train stop buffer bumper

对,就是铁道端头那个巨大的弹簧一类的东西。作用是万一车没停住,撞弹簧上减速慢,危险小一些。叫缓冲

Cache 常见的是这个:

(来源:https://upload.wikimedia.org/wikipedia/commons/6/68/Bear_caches.jpg

没错,就是一种保管箱。看到右边那个被锈掉的 Food Cache 没?这是部署在森林里的存应急物资的保管箱。功能是把你需要用的东西放在更容易拿到的地方。虽然常用准确翻译叫缓存,但个人以为意思表达的不对,丢了一半的功能。台湾的翻译更好,叫快取

相信看完这些应该不用我说区别了?

哎呀还是卖弄一下吧。

简单说,Buffer 的核心作用是用来缓冲,缓和冲击。比如你每秒要写 100 次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个 buffer 暂存起来,变成每 10 秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。

Cache 的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

所以,如果你注意关心过存储系统的话,你会发现硬盘的读写缓冲 / 缓存名称是不一样的,叫 write-buffer 和 read-cache。很明显地说出了两者的区别。

当然很多时候宏观上说两者可能是混用的。比如实际上 memcached 很多人就是拿来读写都用的。不少时候 Non-SQL 数据库也是。严格来说,CPU 里的 L2 和 L3 Cache 也都是读写兼用——因为你没法简单地定义 CPU 用它们的方法是读还是写。硬盘里也是个典型例子,buffer 和 cache 都在一块空间上,到底是 buffer 还是 cache?

不过仔细想一下,你说拿 cache 做 buffer 用行不行?当然行,只要能控制 cache 淘汰逻辑就没有任何问题。那么拿 buffer 做 cache 用呢?貌似在很特殊的情况下,能确定访问顺序的时候,也是可以的。简单想一下就明白——buffer 根据定义,需要随机存储吗?一般是不需要的。但 cache 一定要。所以大多数时候用 cache 代替 buffer 可以,反之就比较局限。这也是技术上说 cache 和 buffer 的关键区别。


补充 1:不要误解 Buffer 就是用来写的,Cache 就是用来读的。读可以用 Buffer 吗?当然可以,比如你想一批一批地处理读取而非有啥处理啥的时候,就可以用读 buffer。写当然也可以用 cache,比如你的写入有很高的随机性的时候。具体什么场景用 Buffer 什么场景用 Cache 要根据场景的具体需要决定。

补充 2:不要误解 Cache 或 Buffer 就一定是内存或者存在什么高速媒介上的东西。只要相对高速即可。我完全可以在硬盘上存 Cache,比如有些游戏会在运行时建立预编译的 shader(暴露年龄),这本质上就是一种 cache,它存在速度缓慢的硬盘上,因为读硬盘依旧比重新编译要快。Buffer 也同理,例如 NTFS 文件系统自己就有 Logging Buffer,这个甚至明确拒绝放在任何易失缓存里。

扫描二维码下载知乎日报

支持 iOS 和 Android
二维码下载知乎日报
阅读更多 印度女性的处境到底有多糟糕? 下载 「知乎日报」 客户端查看更多