两张图,秒懂 Buffer 和 Cache 之间的区别
俩英文单词,不先看看本义吗?虽然都是抽象单词,但在各个地方都有具象的应用。
作者:51CTO技术栈
来源:51CTO技术栈
2017-05-03 21:33:00

Buffer 常见的是这个

c

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

Cache 常见的是这个

d

没错,就是一种保管箱。看到右边那个被锈掉的 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,这个甚至明确拒绝放在任何易失缓存里。

关注中国IDC圈官方微信:idc-quan或微信号:821496803 我们将定期推送IDC产业最新资讯

查看心情排行你看到此篇文章的感受是:


  • 支持

  • 高兴

  • 震惊

  • 愤怒

  • 无聊

  • 无奈

  • 谎言

  • 枪稿

  • 不解

  • 标题党

51CTO技术栈

阅读量
阅读排行榜