`

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

 
阅读更多

作者:沈万马
链接:https://www.zhihu.com/question/26190832/answer/146259979
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

 

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

Buffer常见的是这个:



 
(来源:train stop buffer bumper

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

Cache常见的是这个:



 

(来源:upload.wikimedia.org/wi


没错,就是一种保管箱。看到右边那个被锈掉的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,这个甚至明确拒绝放在任何易失缓存里。
  • 大小: 58.3 KB
  • 大小: 74.4 KB
分享到:
评论
1 楼 兰博基尼 2017-03-12  

相关推荐

    Oracle Buffer和Cache的区别

    Oracle Buffer和Cache的区别 buffer与cache操作的对象就不一样。 buffer(缓冲)是为了提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的。 cache(缓存)是为了提高cpu和内存之间的数据交换速度而设计...

    Mysql优化调优中两个重要参数table_cache和key_buffer

    本文根据作者的一点经验,讨论了Mysql服务器优化中两个非常重要的参数,分别是table_cache,key_buffer_size。 table_cache指示表高速缓存的大小。当Mysql访问一个表时,如果在Mysql表缓冲区中还有空间,那么这个表...

    SQL Server性能调优之缓存

    在执行任何查询时,SQL Server都会将数据...Data Cache是存储数据页(Data Page)的缓冲区,当SQL Server需要读取数据文件(File)中的数据页(Data Page)时,SQL Server会把整个Page都调入内存(内存中的一个Page叫

    嵌入式系统/ARM技术中的嵌入式编程需注意的Cache机制

    CPU与外设交换数据时经常用到buffer(缓冲),这与缓存极其相似,只不过Cache是为了提高CPU和内存之间的数据交换速度而设计,而buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换速度而设计的。  Baidu快照...

    oracle系统结构

    一. Oracle的内存结构描述: 1.... ( 2)数据缓冲区(Data Buffer Cache):对应参数 db_cache_size 用于存储最近从数据库中读取出来的数据块。用户进程首先查看数据缓冲区,不在则访问物理磁盘。

    缓存的概念

    buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘,buffer 一般用于写缓 冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速 度,CPU 会把数据先...

    嵌入式系统/ARM技术中的嵌入式编程需注意的Cache机制及其原理

    CPU与外设交换数据时经常用到buffer(缓冲),这与缓存极其相似,只不过Cache是为了提高CPU和内存之间的数据交换速度而设计,而buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换速度而设计的。  Baidu快照...

    Oracle数据库应用试验指导书.pdf

    数据库高速缓冲区(Database Buffer Cache) 共享存储区(Shared Pool) 重做日志存储缓冲区(Redo Log Buffer) JAVA存储区(Java Pool) 大型存储区(Large Pool) SGA总容量=共享池+缓冲区高速缓存+大型存储区...

    PHP ob缓存以及ob函数原理实例解析

    ob缓存介绍 ob是output buffering的简称,输出缓冲区,缓冲区是通过php.ini中的output_buffering变量控制的。其默认值是off,可以设置为on来打开buffer。打来buffer后,即便程序中没有用ob函数,实际上代码也是使用了...

    SGA包含的组件:共享池

    SGA包含的组件:共享池(shared pool);数据库缓冲区高速缓存(database buffer cache);日志缓冲区(redo buffer cache);大池;Java池;流池等。

    mysql数据库my.cnf配置文件

    # 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享 thread_cache_size = 8 # 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有...

    计算机专业术语大全 chm格式.rar

    Buffer-缓冲区 Buffered Memory-带缓冲的内存 BEDO (Burst EDO RAM) -突发模式EDO随机存储器 Burst Mode-突发模式 Bus-总线 Bus Cycle-总线周期 Byte-字节 Cacheability-高速缓存能力 Cache Memory-高速缓存...

    SkyEye教程

    对于那些想进行嵌入式系统软件开发和学习,或者想研究嵌入式Linux等操作系统和一些底层系统软件(如TCP/IP等)的研究和开发人员来说,可能存在如下几方面的问题:(1)经常苦于经费不足,缺少足够的硬件开发板和完善...

    ORACLE DBA 手册

    调整共享缓冲区缓存 21 库缓冲区 24 调整日志缓冲区 24 调整排序区 25 调整大池缓冲区 26 调整JAVA池缓冲区 26 PRE_PAGE_SGA 27 LOCK_SGA 27 use_indirect_data_buffers 28 pga_aggregate_target: 28 SGA_TARGET 28 ...

    数据库优化设计方案.doc

    SGA包括以下几个部分 : 1、数据块缓冲区(data block buffer cache)是SGA中的一块高速缓存,占整个数据库大小的1%- 2%,用来存储从数据库重读取的数据块(表、索引、簇等),因此采用least recently used (LRU,...

    Buffer-cache-using-enhanced-second-chance-algorithm:在频繁访问磁盘块时,使用增强的第二次机会算法来衡量性能提高

    缓冲区缓存使用增强的第二次机会算法 CSS 430程序4:分页截止日期:请参阅提纲 目的此任务着重于页面替换机制以及通过实现将经常访问的磁盘块存储在内存中的缓冲区高速缓存实现的性能改进。 在本作业中,您将实现OS...

    简单了解Linux性能监控命令free

    在系统遇到各种IO瓶颈,内存使用率高,cpu使用率高等问题时,我们如何来定位错误?linux提供了很多命令来协助我们快速定位到错误,free命令是Linux最...要完全理解上面3行数据,先搞明白buffer和cache是什么。 buffe

    ORACLE 10G 性能优化

    主要内容:收集性能数据、优化SQL语句和应用程序、调整共享池(Shared Pool)的性能、调整缓冲区高速缓存(Buffer Cache)的性能、调整重做有关的性能、共享(多线程)服务器(MTS)、调整磁盘I/O的性能、调整闩(latch)和...

    Oracle10g优化(鼎力推荐)

    主要内容:收集性能数据、优化SQL语句和应用程序、调整共享池(Shared Pool)的性能、调整缓冲区高速缓存(Buffer Cache)的性能、调整重做有关的性能、共享(多线程)服务器(MTS)、调整磁盘I/O的性能、调整闩(latch)和...

    MySQL服务器性能优化.docx

    key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存...

Global site tag (gtag.js) - Google Analytics