彻底搞懂Buffer和Cache的区别

Cache的作用

Cache是快取,是为了加速读的。

使用Cache的原因一般是两设备之间速度差太大,使得高速设备的资源被严重浪费,或者是一方期待另一方尽量快点。使用中间层Cache,可以缓存一些可能被用上的数据,从而减小因速度差带来的低效和浪费。

比如CPU的高速缓存用来缓存一部分内存数据,可减小因CPU和内存之间速度差带来的CPU等待时间,CPU的L1、L2、L3都是因层次速度差而添加的。

再比如将数据库查询结果缓存在Redis中,使得客户端需要这部分数据时不用再从数据库这个低速层次去获取。

与缓存对应的概念是持久化。缓存数据是易失的,为了防止缓存中的重要数据丢失,可能需要将缓存数据持久化保存到持久设备中。

Buffer的作用

Buffer是缓冲数据,即堆积一部分连续操作的数据,然后对堆积在一起的数据执行一次完整的读、写操作。

比如TCP套接字,它有两个buffer空间:send buffer和recv buffer。当它需要发送数据的时候,就会先把数据写到send buffer中缓冲一会,等达到了一定数量(或要求立即发送出去)后,就会把send buffer中的数据发送出去。发送出去就缓冲到了对方的recv buffer中,然后对方就会监控到它的recv buffer中有数据了,就会去读这个recv buffer。

Buffer之所以更高效,原因是N次读或写数据的成本高于一次完成大量数据读写的成本。

比如用小水桶从井中打水装满大水缸,如果大水缸离井较远,打水效率低是因为很多时间浪费在了路上,而且每次打水都要浪费这段时间。这时在井和大水缸的中途使用一个小水缸做缓冲先积累一些水,小水缸满了再一次性将小水缸的运到大水缸。但若大水缸就在井边,每次打水倒入大水缸即可,增加缓冲层反而低效。

对于Buffer来说,需要考虑的不是持久化,而是考虑何时将数据发送出去的问题,例如何时去flush,是否要设置sync模式,以及flush或sync模式带来的低效问题。