Web缓存机制浅析

来源:互联网 发布:java好学吗 编辑:程序博客网 时间:2024/05/21 14:47

本文是个人理解的网络资料整合,如有错误,欢迎指正
缓存的概念
缓存就是用来避免频繁的到主存储器获取数据而建立的一个存取更快的临时存储器。一般来说,缓存存储的容量比主存储器更小,但是存取速度非常快。(主存储器一般来说指的是数据库,结构化的磁盘文件,远程网络接口,程序接口等提供数据返回的存储设备)
使用缓存的2个主要原因:

  • 降低延迟:缓存离客户端更近,因此,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,网站就显得更灵敏。
  • 降低网络负荷:缓存被重复使用,大大降低了用户的带宽使用,其实也是一种变相的省钱(如果流量要付费的话),同时保证了带宽请求在一个低水平上,更容易维护了。

WEB缓存类型

  • 数据库端缓存

这个可以用以“空间换时间”来说。比如建一个表来存储另外一个表某个类型的数据的总条数,在每次更新数据的时候同事更新 数据表和统计条数的表。在需要获取某个类型的数据的条数的时候,就不需要select count去查询,直接查询统计表就可以了,这样可以提高查询的速度和数据库的性能。

  • 应用层缓存

1、缓存数据库的查询结果,减少数据的压力,这个在大型网站是必须做的。
2、缓存磁盘文件的数据,比如常用的数据可以放到内存,不用每次都去读取磁盘,特别是密集计算的程序。
3、缓存某个耗时的计算操作,比如数据统计。

应用层缓存架构:
1、嵌入式,也就是缓存和应用在同一个机器。比如单机的文件缓存, php中x-cache,apc等的基于进程的缓存,java中用hashMap来缓存数据等。这种缓存速度快,没有网络消耗。
2、分布式缓存,把缓存的数据独立到不同的机器,通过网络来请求数据,比如常用的共享文件服务器、Memcache、MemcacheDb、Tokyo Tyrant, Java实现oscache,jcache ,ehcached等。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。也是一个高速缓存系统,类似于memcached,但是支持更复杂的数据结构List、Set、Sorted Set,并且有持久化的功能。
分布式缓存一般可以分为几种:
1、按应用切分数据到不同的缓存服务器,这是一种比较简单和实用的方式。
2、按照某种规则(hash,路由等等)把数据存储到不同的缓存服务器
3、代理模式,应用在获取数据的时候都由代理透明的处理,缓存机制有代理服务器来处理

  • 前端代理缓存

大公司和ISP(Internet Server Provider)经常在他们的防火墙或者单独的设备(也被称为中介intermediaries)上架设代理缓存。由于代理服务器缓存并非客户端或者源服务器的一部分,而是处于网络中,请求需要以某种方式路由到它们。一种方法是手动设置浏览器指定代理服务器,另外就是使用拦截代理(Interception proxies)把Web请求根据自己的底层网络重定向,这一过程对客户端来说是透明的。代理缓存属于一种共享缓存;往往有大量的用户使用,因此,其在降低延时和网络流量上很有用。

网关缓存是反向代理缓存的一种,起中介作用的,可以有多种方法把请求路由到网关缓存,但通常使用某种形式的负载均衡器,使它们中的一个或多个看起来像是源服务器。CDN为整个(或部分)网络分配网关缓存,然后把这些缓存卖给需要的网站。Speedera和Akamai就是代表性的网络内容发布商。

1、负载均衡器:基于各种分配算法把网络请求分散到一个服务器集群中的可用服务器上去,通过管理进入的Web数据流量和增加有效的网络带宽,从而使网络访问者获得尽可能最佳的联网体验的硬件设备。

2、内容分发网络:CDN(Content delivery networks)的基本思路是将缓存服务器分布到用户访问相对集中的地区,在现有的互联网基础之上构建一层智能虚拟网络,利用中心平台的负载均衡、内容分发、调度等功能模块,实时地根据网络流量和服务器集群中各节点的连接负载状况、到用户的距离、响应时间等综合因素,将用户的请求指向距离用户最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。从而尽可能避开互联网上可能影响数据传输速度和稳定性的瓶颈和环节,实现降低网络拥塞,更快更稳定的数据传输,提高用户访问的响应速度和命中率。

3、Speedera:是一家全球性的内容服务提供商,它与北美、欧洲以及亚太地区的1000多家大型运营商都有联系,并为那些不想在自己服务器上寄存内容的公司提供软件下载、媒体及其它服务管理等业务。05年的时候被Akamai以$130m的价格给收购了。

4、Akamai:美国Akamai是国际上最大的CDN服务商,它巨大的网络分发能力在峰值时可达到15Tbps。Akamai公司是为数不多的旨在消除Internet瓶颈和提高下载速度的几家新公司之一,是一个致力于网络交通提速的”内容发布”公司,是波士顿高技术区最卓越的新兴企业之一。Akamai公司向全球企业提供发送互联网内容,汇流媒体和应用程序的服务。1998年,丹尼尔和麻省理工学院的一些研究人员一起创立了这家公司,他在麻省理工学院的硕士论文构成了Akamai公司最初的”自由流”(Freeflow)技术的核心。

5、前端其他常用的代理缓存服务器就是Squid,Varnish,Ncache等等。

补充知识点
PHP Opcode缓存
Opcode是一种PHP脚本编译后的中间语言,类似于Java的ByteCode;先了解一下PHP代码执行的过程:
Zend Engine调用词法分析器将要执行的PHP源文件,去掉空格 ,注释,分割成语言片段——Tokens;
Zend Engine将得到的Tokens forward给语法分析器, 将Tokens转换成简单而有意义的表达式;
Zend Engine调用zend_compile将表达式编译成Opocde,Opocde保存在op_array中,它是PHP执行的中间语言。
Zend Engine调用zend_execute顺次执行op array,输出结果。

每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重行生成Opcode,结合在Web中无所不在的缓存机制,可以把Opcode缓存下来,下次请求相同的内容,直接从已缓存的Opcode中取出执行,就不需要重复执行前面3步,从而大幅的提高PHP的执行速度。启用Opcode缓存之后的流程图如下所示:
这里写图片描述
Opcode Cache的目地是避免重复编译,减少CPU和内存开销。如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么Opcode Cache的性能提升是非常有限的。
PHP通过缓存页面加速动态内容生成的原理
很多网站都是PHP构建的,PHP可以很方便的从文件或数据库中读取内容,然而响应时间长是它一个缺点,来自用户的每一次请求都可能触发多次对数据库的查询,然后PHP处理查询结果,以某种形式呈现出来,像drupal这种庞大的CMS(Content Management System),每次打开一个页面要调用数十个PHP文件,执行数万行代码,效率可想而知。

可以使用缓存来解决上面描述的问题,把PHP执行后的数据缓冲到内存中从而避免重复编译;即在第一次请求由PHP脚本编译执行生成页面,返回结果给用户的同时,将此次PHP脚本返回给浏览器的内容存储一个备份。下一次,当用户请求相同的内容,PHP脚本就会知道它已经生成了这个页面,于是直接用缓存下来的结果响应给用户的请求。

参考文档
http://blog.yadgen.com/?p=891
http://www.cnblogs.com/sunli/archive/2009/11/24/1609444.html
http://www.zhangxinxu.com/wordpress/2013/05/caching-tutorial-for-web-authors-and-webmasters/
https://blog.linuxeye.com/361.html

0 0
原创粉丝点击