缓存机制

Aug 25, 2016


  缓存原意是指高速数据交换存储器。现在这一概念已经被扩充,不仅在CPU与主内存之间存在缓存, 而且在内存和硬盘之间也有缓存。缓存有三个要素:命中率、缓存更新策略、缓存最大数据量。

一、缓存三要素

1、命中率
  通常通过命中率衡量缓存机制的好坏和效率。 命中率请求缓存的次数和缓存返回正确结果的次数的比例,比例越高,证明缓存的使用率越高。

2、缓存更新策略
  MySql内置了查询缓存(Query Cache),这个缓存的更新策略很简单。 在MySql中,可以设置查询缓存使用的内存大小,MySql会把默认可以缓存的sql语句的结果集进行缓存, 一旦内存塞满后,就会剔除老的缓存对象。同时,为了保证缓存中的数据与实际数据完全一样, 当表中的数据有任何变化,都会使所有引用该表的缓存失效。
  一般把缓存更新策略归纳为以下几种:

  • FIFO[First In First Out]。最先进入缓存的数据在存储空间不够的情况下会被首先清理出去。
  • LFU[Less Frequently Used]。最少使用的元素会被首先清理掉。这要求缓存元素有hit属性, 在缓存空间不够的情况下,首先被清理掉。
  • LRU[Least Recently Used]。最近最少使用元素被清理。缓存元素有一个时间戳,当缓存容量满了, 而又需要腾出地方存放新元素时,现有的缓存元素中时间戳离当前时间最远的元素将被剔除。

3、缓存最大数量
  缓存最大数量是指缓存中能处理的元素最大个数或所能使用的最大存储空间。 通常各种缓存机制都会对缓存的最大数据量进行限制,可以是固定大小的存储空间、集合个数, 或者由操作系统所能分配和处理的存储空间决定。
  例如MySql的查询缓存最大数据量是由查询缓存数决定,并且可以修改。 而基于内存的Key-Value实施方案Memcached,其缓存最大数据量可以使用内存由操作系统决定。
  超过缓存机制所允许的最大数据量系统会进行相应的处理,一般有四种处理方式:

  • 停止缓存服务,所有缓存数据被清空。
  • 拒绝写入,不在对缓存数据进行更新。
  • 根据缓存更新策略更新旧数据。
  • 在3的基础上,将淘汰的数据备份,腾出新空间。

二、客户端缓存

  缓存的最后一层,是直面客户端的客户端缓存。通常也把这部分成为web缓存。web缓存位于客户端。缓存会根据进来的请求保存输出的副本,例如HTML页面、图片、文件等。然后,当下一个请求到来时如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。
  Web缓存的具体实现是由浏览器来实现的。浏览器在计算机上开辟一块硬盘空间用于存储已经看过的网站的副本。浏览器缓存根据非常简单的规则进行工作:在同一个会话过程中检查并确认缓存的副本足够新。这个缓存对于用户单击“后退”或者刚刚点击过的链接非常有帮助。
  前端页面缓存主要遵循HTTP协议和客户端的设置工作。通常遵循的规则如下:

  • 如果响应头信息告诉缓存器不要保留缓存,缓存器就不会缓存相应内容。
  • 如果请求信息需要认证或者加密,相应内容也不会被缓存。
  • 如果不存在校验器,缓存器会认为缺乏直接的更新度信息,内容不可缓存。
  • 含有完整的过期时间和寿命控制头信息,并且内容在保鲜期内。
  • 浏览器使用过缓存副本,并且在一个会话中已经检查过内容的新鲜度。
  • 缓存代理服务器近期内已经使用过缓存副本,并且内容的最后更新时间在上次使用期之前。
  • 够新的副本将直接从缓存中送出,而不会向源服务器发送请求。
  • 如果缓存的副本已经太旧,缓存服务器将向源服务器发送请求,用于确定是否可以继续使用当前拷贝继续服务。

三、Web服务器缓存

  在Web层面上的缓存,除了基于HTTP协议加浏览器实现外,还可以通过一些Web服务器自带的缓存组件,以及服务器和浏览器之间的代理服务器提供的缓存功能。
1、Apache缓存
  Apache的Expires和Cache-Control模块包含控制缓存信息。这些模块需要和Apache一起编译。Apache lounge是Apache的改进版本,在性能、稳定性和内存管理上都超越官方版本。
2、Nginx缓存
  Nginx是高性能HTTP和反向代理服务器,也是IMAP/POP3/SMTP代理服务器。Nginx具有体积小、配置简单、扩展性强的特点。可以通过众多的开源模块发挥强大的功能。Nginx性能远远超越传统的Apache。Nginx配合PHP的FashCGI模式,充分利用PHP的天生优势,具有极大的负载能力。