此文是看到驳:《缓存黄金原则:让数据更靠近CPU》一文有感而发。
为什么要缓存,什么是缓存
先假设一个简化的场景——CPU要读取一段数据,此场景涉及以下东西:
CPU、CPU缓存、内存、外存(硬盘等)。
请看CPU读取数据的流程图:
(图一)
从图上看,如果CPU要访问的数据保存在外存中,那么频率为1G的CPU访问外存需要的时间最少也要20000000(周期) X 1/1000000000 (秒/周期) = 1毫秒,相对于人的感觉来说挺快了,但是相对访问高速缓存就是云泥之别……此时内存中如果保存了CPU需要访问的数据的话,那么就可以省掉访问外存这一步,节省了大量时间,这就是为什么要缓存的原因,此时内存就缓存来自外存的数据,以此类推,较高级的存储器可以缓存其下级存储器的数据。
其实从上图已经可以看出为什么让数据离CPU更近是黄金法则了,接下来再举个具体的基于web的例子从更宏观的角度说一下,请看图:
(图二)
客户端需要读取服务器上的一个页面,它首先检查该页是否曾访问过了,这个检查过程就跟图一一样需要访问本地的存储设备(此时本地存储器变成了网络的缓存),如果否的话,那就要访问网络,经过漫长的等待(网速不给力啊……)终于取回需要的页面了,到目前为止,你是不是真心希望要是页面在本机的高速缓存里该多好,那速度绝对刚刚的。
刚才只简单的说了访问网络,现在我们放大访问网络这个过程的细节:
首先忽略网络传输这个过程,因为这个一直很慢,而且不是我等挨踢民工可以控制的,只需要知道这个过程需要消耗相当多的时间就行了。
到了服务器端,服务器的CPU需要从它的存储器中读取这个页面,然后向网络设备写入传送给客户端,此时你是不是又发现如果这个页面被缓存在服务器中高层次的缓存里貌似能节省不少时间……
在web场景下,那句“缓存黄金原则:让数据更靠近 CPU。”主要指服务器端的CPU,那是因为开发者对客户端缓存只有很小的影响,而服务器端的缓存是可以完全控制的。
补充一下:需要更多细节,想完全搞懂缓存机制的兄弟,可以去看看《深入理解计算机系统》这本书的第六章——存储器层次结构。