标签归档:查询缓存

关于缓存

维基百科中有这样一段描述: 凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。 从最初始的处理器与内存间的Cache开始,都是为了让数据访问的速度适应CPU的处理速度, 其基于的原理是内存中“程序执行与数据访问的局域性行为”。

处理器缓存

在处理器与物理内存间有三级缓存,如下图: 

这是《深入理解计算机系统》上的一张图,对于每一层,位于上层的更快更小的存储设备作为位于下层更大更慢的存储设备的缓存。 从物理内存往上越往处理器方向走,存储设备的成本越高,并且更小,访问的速度更快。 它们是作为存储在更大更慢的存储设备的缓存而存在,它们的作用在于协调处理器与物理内存间的传输数据不一致。 但是把内存单独拉出来说,它也是一种缓存,它的作用也是为了将硬盘或其它较慢存储介质中的数据更快的提供给处理器。

DNS缓存

DNS(域名解析系统)缓存是指当第一次访问某个站点的时候,客户端会向DNS服务器发出解析请求, 然后把信息保存在本机的DNS缓存以备再次访问。启用DNS缓存能提高网络访问速度,相应地,计算机的安全性降低了。

HTTP协议缓存

HTTP为提高性能,减少网络传输的信息量,从而使用了缓存。 HTTP协议缓存的目标是去除许多情况下对于发送请求的的需求和去除许多情况下发送完整请求的需求。 在HTTP协议中使用截止模型和证实模型来实现缓存。 协议它只是协议,只是一种通行的建议和规范,关键还是看客户端的实现。 比较直观的体现是:当第一次去一个网站时加载会比较慢,但再次打开这个网站时速度会快很多。 这是由于基于HTTP协议,浏览器客户端将一些CSS,图片等文件都缓存在本地,从而不再需要从服务器读取。

DNS缓存、HTTP协议缓存的作用与处理器缓存有一些不同,虽然也是协调数据传输速度的差异,但是其本质的差别是它已不再是纯粹的两种硬件之间的差异, 而是引入了网络的元素,换一种表示方式:凡是位于速度相差较大的两种实体之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。

数据库系统缓存

这里没有用数据库缓存是因为数据库与数据库系统在概念上不是一回事。数据库是“按照数据结构来组织、存储和管理数据的仓库”。 而数据库系统是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。 我们平时所说的数据库缓存是数据库系统所提供的缓存功能。

以MySQL为例,我们使用最多的是查询缓存(Query Cache)。 它的实现过程不是很复杂,当客户端请求了一个查询后,MySQL通过特定的Hash算法生成一个标识用的hash值, 得MySQL计算完后,返回的结果集将与这个生成的hash值对应存放在内存中。若此缓存没有过期时, 下一次相同的请求过来时将直接返回结果,不再需要SQL解析,计算等操作。

PHP内存管理中的缓存

PHP内存管理中的缓存也是基于“程序执行与数据访问的局域性行为”的原理。 引入缓存,就是为了减少小块内存块的查询次数,为最近访问的数据提供更快的访问方式。 其实现过程主要包括以下的一些活动:

  • 标识缓存和缓存的大小限制,即何时使用缓存,在某些情况下可以以最少的修改禁用掉缓存
  • 缓存的存储结构,即缓存的存放位置、结构和存放的逻辑
  • 初始化缓存
  • 获取缓存中内容
  • 写入缓存
  • 释放缓存或者清空缓存列表

文件缓存

此处的文件缓存是指在应用开发过程中将一些中间结果存放在文件,以备下次使用。 如在PHP中一些模板系统的实现,以其规则编写了模板文件,生成中间的PHP文件,如果用户调用某个页面则直接访问PHP页面,而跳过了模板的解析过程

以上三种缓存与前面也不一样,它实际上是将一些需要计算后的结果缓存,下次直接返回计算后的结果。依此,则缓存的表述可以再次修改为: 凡是获取数据速度相差较大的两种实体之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。