美文网首页
如何开发高性能应用,高性能的魔法师:缓存

如何开发高性能应用,高性能的魔法师:缓存

作者: you的日常 | 来源:发表于2021-02-26 12:09 被阅读0次

在大型系统中,随着用户量的增加,系统性能逐渐变成了瓶颈。而解决系统系统问题的不二法则就是缓存,缓存无处不在,硬件缓存例如 CPU 缓存、GPU 缓存等等、软件缓存例如页面缓存、内存缓存、数据库缓存等等,其核心目的就是为了提升性能加快访问。掌握了缓存的相关知识,那么在我们做系统优化时就可以做到游刃有余,同时也更利于我们开发出高性能的系统。

缓存概述

对各种缓存技术进行概要介绍,同时重点讲解 Cache 和 Buffer 的区别。虽然中文都翻译成缓存,但严格地说,Buffer 更应该翻译成缓冲而不是缓存,至少我是这么觉得。

缓存相信大家都经常遇到,那么你真的了解缓存吗?

首先我们从缓存存在的意义说起。缓存可以帮助应用程序显著地提高执行速度。我们实际生活中会遇到各种各样的缓存,包括硬件缓存和软件缓存。我们知道 CPU 处理速度非常快,大概以 2 纳秒为周期,CPU 访问一次内存需要大概 60 纳秒,这样就导致大大拖累了 CPU 的处理效率。

在这里插入图片描述

为了解决这个问题,设计师在主板上设计一个存储,称为 L2 Cache,CPU 访问 L2 缓存大概需要 30 纳秒,至少提高了 2 倍访问速度。另外,在 CPU 芯片中设置一个更小但是更快的缓存,称为 L1 缓存,CPU 访问 L1 缓存的速度是访问 L2 的 3.5 倍, 通过这种方式可以大大提高 cpu 的处理效率。有的计算机会在 CPU 中设置两块缓存(L1 和 L2 缓存),这样主板上的缓存就称为 L3 缓存了。

当我们使用浏览器浏览网站的时候,浏览器会在硬盘上开辟一块空间(通常是在某个文件夹下)来缓存页面内容。第一次访问页面的时候,你的浏览器在显示页面的同时会复制一份到该文件夹下,下一次当你访问同一个页面时,浏览器判断网络上的页面是否有更新,如果不是,则直接使用文件夹下的页面而不是从网络下载页面,这样极大的加快了访问速度。

很多同学对 Cache 和 Buffer 弄不清楚,因为他们都翻译成缓存,那么他们究竟有什么不同呢?其实 Buffer 更准确的翻译应该称为缓冲,例如某个快速运动的物体为了防止撞墙,往往在墙边安装一些弹簧,这样起到一个缓冲的作用;另外当从网络高速下载东西时,往往在硬盘上会有一个缓冲区,下载的内容先进入缓冲区,然后再匀速的写入硬盘,防止时高时低的网络下载速度对硬盘造成的伤害, 可见缓冲有均衡流量的作用。

而缓存主要是为了加快取用速度,简单的说就是把数据拿到离得更近速度更快的地方,这样要用的时候可以更快的得到,或者你好不容易算出了一个结果,你就可以把这个结果缓存起来,下一次直接拿来用不用重新耗费时间去计算了。

缓存如何工作

以具体例子讲解缓存的工作原理,明白了工作原理以后就明白了应该如何正确的在系统中使用缓存技术。在讲解过程中会选择不同类型的缓存进行具体分析,分析过程中会详细阐述工作流程、缓存策略、及存在的相关问题。

如果你去电脑城买电脑你一定听过朋友告诉过你“买这个款式的电脑吧,他的 cpu 有三级缓存,别买这个款式的电脑,这个款式的电脑 cpu 没有缓存”,可见缓存对计算机性能有重要的影响,常见的有内存缓存、硬盘缓存、页面缓存等等,虚拟内存也是一种缓存。

缓存是在不提高计算机价格成本的条件下大大提高计算机性能的一种技术方法,我们打个比方,我们把计算机比喻成一所图书馆,图书馆门前有一位图书管理员,假设每次读者借书都必须通过图书管理员,我们首先看看没有缓存的情况。第一个读者来了,他要借《乱世佳人》,管理员去仓库找到这本书,给到读者。过几天读者读完了,还书的时候管理员再次将书还会回仓库中原来的位置,假设过几天第二位读者来了,他也想借《乱世佳人》,管理员必须再次回到仓库找到这本书并给到读者,在这种情况下,管理员不得不对每一本书都来回一趟去仓库取,哪怕一些经常被借的书也必须这样。

有没有改良方法呢?有的,我们可以在管理员旁边放一个书架充当缓存,假设这个书架可以放 10 本书,这就相当于一个可以容纳 10 个元素的缓存。

当第一个读者归还了书以后,管理员不再放回仓库而是放到书架上,这样当第二个读者来借书的时候,管理员首先看看书架上是否有这本书,一看第二位读者想要借的书正好是第一位读者还的书,于是他直接拿起这本书给第二位读者,无需再跑到仓库去找了。这就大大节省了时间。

假设第二位读者借的书不在书架里面怎么办?

管理员首先在书架查找,没找到,于是他再去仓库找这本书。和没有缓存的系统相比,这种情形下多出了查找书架缓存的时间,缓存设计的一个重点就是要尽量减少缓存查找的时间,现在在硬件层面上已经大致可以将缓存查找时间减少到约等于 0 了,在软件层次上,很多缓存系统中查找缓存的时间和去后台取数的时间相比微乎其微可以直接忽略了。

从上面的例子中我们可以看出:

相关文章

网友评论

      本文标题:如何开发高性能应用,高性能的魔法师:缓存

      本文链接:https://www.haomeiwen.com/subject/enpsnktx.html