在商业的世界中,常说的一句话是“现金为王”。在互联网或者移动互联网乃至整个软件技术世界中,与之相近的一个说法就是“缓存为王”。什么是缓存呢?
1.1 什么是缓存?
缓存:存储在计算机上的一个原始数据复制集,以便易于访问—— 维基百科
缓存是系统快速响应中的一种关键技术,是一组被保存起来以备将来使用的东西,介于应用开发和系统开发之间,是产品经理们经常顾及不到的地方,也是技术架构设计中的非功能性约束。
因为“缓存为王”,很多技术都打着缓存的旗号,所以谈起缓存往往似是而非。
例如,CPU的缓存,是指位于CPU与内存之间的临时存储器,容量比内存小的多但交换速度却比内存要快得多。由于CPU的运算速度要比内存读写速度快很多,CPU总有等待数据的时候,而高速缓存则解决了CPU运算速度与内存读写速度不匹配的矛盾。缓存中的数据是内存中的一部分,且这部分是短时间内CPU即将访问的,当CPU调用数据时,先从缓存中调用,从而加快读取速度。而且,CPU 是有多级缓存的,有时候也称为几级流水。
再例如,Linux 操作系统中的文件缓存如图1-1所示。
我们平时在编程的时候,包括CPU接触到的都是虚拟地址而不是真实的物理地址,这是虚拟内存的一大主要功能。假如请求一个页的地址,需要将页的虚拟地址转化为页的物理地址。页表(page table)和内存管理单元(MMU)就负责将页的虚拟地址映射到物理地址。页表负责记录哪些是物理页,哪些是虚拟页,以及这些页的页表条目(PTE)。而MMU是一个物理硬件,MMU负责进行虚拟地址进行物理地址的翻译,翻译过程中需要从页表获取页的PTE,MMU也会使用翻译后备缓存器(TLB)的缓存页号,所以,在操作系统层面都有缓存。
因此,缓存与语境有着紧密的关系,缓存在不同场景有着不同的意义,采用的技术手段也是不同的。不涉及操作系统和硬件的缓存,根据缓存在软件系统中所处位置的不同,大体可以分为三类:
• 客户端侧的缓存
• 服务器侧的缓存
• 网络中的缓存
根据缓存的规模和部署方式也可以分为:
• 单体缓存
• 缓存集群
• 分布式缓存
可见, 在软件系统中缓存几乎无处不在,这或许就是缓存为王的一个原因吧。
1.2 为什么使用缓存?
在看这个问题之前,我们可以先看一下成功的软件产品具备哪些特点:能解决目标用户的痛点,能够为企业或个人带来利益,具有不错的用户粘性…… 其中一个极其重要的因素就是要有好的用户体验。
1.2.1 从用户体验说起
用户体验这个词最早被广泛认知是在20世纪90年代中期,由用户体验设计师唐纳德•诺曼(Donald Norman)提出和推广。 信息技术在移动和图像处理等方面取得的进展已经使得人机交互(HCI)技术几乎渗透到人类活动的所有领域。这导致了一个巨大转变──系统的评价指标从单纯的可用性,扩展到范围更丰富的用户体验。用户体验在人机交互技术发展过程中受到了相当的重视,其关注度与传统的三大可用性指标(即效率,效益和基本主观满意度)不相上下,甚至比传统的三大可用性指标的地位更重要。
什么是用户体验?
SO 9241-210标准将用户体验定义为 “人们对于针对使用或期望使用的产品、系统或者服务的认知印象和回应”。因此,用户体验是主观的,且注重实际应用。 ISO在定义的补充说明中有着如下解释:用户体验,即用户在使用一个产品或系统之前、使用期间和使用之后的全部感受,包括情感、信仰、喜好、认知印象、生理和心理反应、行为和成就等各个方面。 ISO标准暗示了可用性也可以作为用户体验的一个方面,“可用性标准可以用来评估用户体验一些方面”。不过,该ISO标准并没有进一步阐述用户体验和系统可用性之间的具体关系。显然,这两者是相互重叠的概念。
有许多因素可以影响用户体验,这些因素被分为三大类:使用者的状态、系统性能及环境。其中系统性能是软件产品自身对用户体验的关键性因素之一。由于感受软件性能的主体是人,不同的人对于同样的软件能有不同的主观感受,而且不同的人对于软件性能关心的视角也不同。系统性能是一种非功能特性,它关注的不是某种特定的功能,而是在完成该功能时所展示出来的及时性。
1.2.2 关于系统的性能
系统性能的指标一般包括响应时间、延迟时间、吞吐量,并发用户数和资源利用率的几个方面。
响应时间是指系统对用户请求作出响应的时间,与人对软件性能的主观感受是非常一致的,它完整地记录了整个团结系统处理请求的时间。由于一个系统通常会提供许多功能,而不同功能的处理逻辑也千差万别,因而不同功能的响应时间也不尽相同,甚至同一功能在不同输入数据的情况下响应时间也不相同。所以,响应时间通常是指该软件系统所有功能的平均响应时间或者所有功能中的最大响应时间。当然,有时候也需要对每个或每组功能讨论其平均响应时间和最大响应时间。
在讨论软件性能时,我们更关心所开发软件本身的“响应时间”。也就是说,可以把用户感受到的响应时间划分为“呈现时间”和“系统响应时间”,前者是指客户端在接收到系统数据时呈现页面所需的时间,而后者是指客户端接收到用户请求到客户端接收到服务器发来的数据所需的时间。还可以把“系统响应时间”进一步分解为“网络传输时间”和“应用延迟时间”,其中前者是指数据在客户端和服务器端进行传输的时间,而后者是指系统实际处理请求所需的时间。
吞吐量是指系统在单位时间内处理请求的数量。对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。无并发的应用都是单机应用,对于互联网或者移动互联网上的产品而言,并发用户数是指系统可以同时承载的正常使用系统功能的用户数量。与吞吐量相比,并发用户数是一个更直观但也更笼统的性能指标。而资源利用率反映的是在一段时间内资源平均被占用的情况。
从浏览器到网络,到应用服务器,甚至到数据库,通过在各个层面应用缓存技术,整个系统的性能将大幅提高。例如,缓存离客户端更近,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,系统就显得更灵敏。缓存数据的重复使用,大大降低了用户的带宽使用,其实也是一种变相的省钱(如果流量要付费的话),同时保证了带宽请求在一个低水平上,更容易维护。所以,使用缓存技术,可以降低系统的响应时间,减少网络传输时间和应用延迟时间,进而提高了系统的吞吐量,增加了系统的并发用户数。利用缓存还可以最小化系统的工作量,使用了缓存就可以不必反复从数据源中查找,缓存所创建或提供的同一条数据更好利用了系统的资源。
因此,缓存是系统调优时常用且行之有效的手段,无论是操作系统还是应用系统,缓存策略无处不在。
音乐是时间的艺术,那么,缓存就是软件系统中关于时间的艺术。“缓存为王”本质上是系统性能为王,对用户而言就是用户体验为王。
1.3 从网站的架构发展看缓存
最初的网站可能就是一台物理主机,放在IDC或者租用的是云服务器,上面只运行着应用服务器和数据库,LAMP(Linux Apache Mysql Php)就是这样流行起来的。由于网站具备了一定的特色,吸引了部分用户的访问,逐渐会发现系统的压力越来越大,响应速度越来越慢,而这个时候比较明显的往往是数据库与应用的互相影响,于是将应用服务器和数据库服务器从物理上分离开来,变成了两台机器,这个时候技术上没有什么新的要求,系统又恢复到以前的响应速度了,并且支撑住了更高的流量,并且不会让数据库和应用服务器形成互相的影响。这时网站后台的简单架构一般如图1-2 所示。
图1-2 简单的网站架构示意图
随着访问网站的人数越来越多,响应速度又开始变慢了,可能是访问数据库的操作太多,导致数据连接竞争激烈,因此缓存开始登场。若想通过缓存机制来减少数据库连接资源的竞争和对数据库读的压力,那么可以选择采用静态页面缓存,这样程序上可以不做修改,就能够很好地减少对web服务器的压力以及减少对数据库连接资源的竞争。随后,动态缓存登场,将动态页面里相对静态的部分也缓存起来,因此考虑采用类似的页面片段缓存策略。
随着访问量的持续增加,系统又开始变慢,怎么办?数据缓存来了,将系统中重复获取的数据信息从数据库加载到本地,同时降低了数据库的负载。
随着系统访问量的再度增加,应用服务器又扛不住了,开始增加web服务器。那如何保持应用服务器中数据缓存信息的同步呢?例如之前缓存的用户数据等,这个时候通常会开始使用缓存同步机制以及共享文件系统或共享存储等。
在享受了一段时间的访问量高速增长后,系统再次变慢。开始数据库调优,优化数据库自身的缓存,接下来是采用数据库集群以及分库分表的策略。分库分表的规则是有些复杂的,考虑增加一个通用的框架来实现分库分表的数据访问,这个就是数据访问层(Data Access Layer,DAL)。同时,在这个阶段可能会发现之前的缓存同步方案可能会出现问题,因为数据量太大,导致现在不太可能将缓存存储在本地后在同步,于是分布式缓存终于来了,将大量的数据缓存转移到分布式缓存上了。
至此,系统进入了无级缩放的大型网站阶段,当网站流量增加时,应对的解决方案就是不断的添加web服务器,数据库服务器,以及缓存服务器了。此时,大型网站的系统架构演变为图1-3 所示。
图1-3 大型网站的架构示意图
纵观网站架构的发展历程,业务量的增长是幸福的,但也是成长的烦恼,而缓存技术就是解除烦恼的灵丹妙药,再次证明了什么是缓存为王。
现在,可以从缓存在系统中的位置来看看这一王者在系统中各个层面的应用了。
欲了解更多有关分布式缓存方面的内容,请阅读《深入分布式缓存:从原理到实践》一书。
京东购书,扫描二维码: