互联网技术架构——巧妙利用缓存

在浏览器知道云的每一个层次里,通过缓存可以显著提高扩展能力。缓存也有助于减少系统负担,可以使你不必对同一数据一遍又一遍地查找。创建或服务。


利用CDN缓存

用CDN(内容分发网络)来减少网站的负载。CDN是快速而且简单的平缓高峰流量和一般流量增长的方式。确保进行成本效益分析,同时监控CDN的使用量。

CDN是一组计算机,也称为节点或边缘服务器,通过骨干网络连接起来,上面存储着客户数据或内容(图像、网页等)的副本。通过在不同的一级网络,策略性地部署边缘服务器并应用大量的技术和算法,CDN可以把用户的请求指定到最适合响应的节点上。这种优化的逻辑可以是基于最少网络跳数、最高可用性或最少请求。这种优化常常聚焦在减少最终用户、请求者或服务可以感知的响应时间方面。

源服务器的内容缓存在CDN服务器上,CDN服务器定期查询源服务器以便更新。这样,CDN负责处理所有的请求,只有当需要查询缓存内容是否更新时才会访问你的服务器。

无论网站是静态还是动态,都可以考虑加入CDN形成混合缓存。该层缓存可以提供快速交付的好处,通常有非常高的可用性,而且网站服务器处理的流量更少。


灵活管理缓存

可以使用Expires头来减少请求量,提高系统的可扩展性和性能。可以通过应用代码在网络服务器上设置头字节。对每类对象(图片、HTML、CSS、PHP等),根据目标可缓存时间安排最合适其时间长度的头字节。

但是不可以通过定义页面要素HEAD中的meta标签,如Pragma、Expires或者Cache-Control来控制页面的缓存行为。HTML中的meta标签是用来建议浏览器应该如何处理界面的,但很多浏览器不注意这些,甚至代理缓存根本不检查HTML。

我们应使用HTTP头,它提供了比meta更多的缓存控制。特别是有关代理缓存,因为它们确实会注意HTTP头。这些头在HTML中看不到,它们由网络服务器生成页面的代码动态生成。可以通过服务器配置或代码来控制它们。

Expires头子段

Expires实体头子段提供响应有效期信息。如果想要把响应标记为“永不过期”,源服务器就应发送从响应时间算起一年后的日期。

Cache-Control头子段

  • public——响应可以由任何缓存、共享或非共享缓存来处理。
  • private——响应针对单用户,不能由共享缓存来进行缓存。
  • no-cache——在与源服务器确认之前,不得使用缓存来满足后续的其他需求。
  • max-age——如果当前数值大于在请求时给定的值(秒),那么响应过时。

设置HTTP头可以通过网络服务器和代码来实现。

我们可以调整网络服务器的配置,以优化其性能与可扩展性。keep-alives或HTTP持久连接允许多个HTTP请求复用TCP连接。HTTP/1.0 使用非持久连接。HTTP/1.1 默认使用持久连接。例如,在Apache的httpd.conf文件中keep-alives的默认设置为打开,但KeepAliveTimeOut的默认值为5秒。超时设置较长的好处是不必建立、使用和终结TCP连接就可以处理更多的HTTP请求;超时设置较短的好处是网络服务器的线程不会被捆绑住,可以继续服务其他请求。根据应用或网站的具体情况在两者之间寻找平衡点很重要。


利用Ajax缓存

适当使用HTTP响应头以确保Ajax调用可以缓存。适当调整Last-Modified、Cache-Control和Expires头。可以减少用户可感知的响应时间,增加用户满意度,提高平台或方案的可扩展性。

Ajax在发送的数据成功后,会把请求的URL和返回的响应结果保存在缓存内,当下一次调用Ajax发送相同的请求时,它会直接从缓存中把数据取出来,这是为了提高页面的响应速度和用户体验。当前这要求两次请求URL完全相同,包括参数。这个时候,浏览器就不会与服务器交互。

以搜索为例,Ajax可以通过用户后续的每个按键向服务器发送请求,根据已键入的词而返回搜索结果,并在不需要用户介入刷新浏览器的情况下,把搜索结果填充到下拉菜单。

对于静态或半静态的对象,如长期固定不变的图片,其Expires有效期应该设置为几天或者更长。某些时间敏感性很强的对象,如好友的状态更新,其Expires有效期可以设置为数秒甚至几分钟,以给用户实时的感觉,同时降低整体的负载。

Last-Modified头应设置为过去,并设置Cache-Control为public以缓存并在其他系统中复用对象。


利用页面缓存

在网络服务器的前段部署页面缓存。通过缓存和分发以前产生的动态请求来降低网络负载,快速响应静态对象请求。

页面缓存是部署在网络服务器前面的缓存服务器,用来减少静态和动态对象对这些服务器的请求。

页面缓存处理某些或所有的请求,直到所存储的页面或者数据过时,或服务器查询不到用户请求需要的数据。

除了Cache-Control、Last-Modified和Expires之外,还应尽可能设置ETag头。


利用应用缓存

我们可以把服务和用户进行拆分,以提高缓存的命中率。


利用对象缓存

对象缓存是用来存储每个对象的哈希摘要的数据存储。我们可以用在重复查询或计算的时候,实现对象缓存以帮助扩展持久层。

查看SQL查询排行榜来判断系统是否需要目标缓存。

使用Memcached实行目标缓存。首先连接到Memcached服务器,如果连接失败则执行SQL查询;如果连接成功,就尝试检索与特定key相关联的data,如果检索失败,执行SQL查询并将结果存入Memcached。set命令中的false标识用于压缩,90是以秒计算的缓存有效期。

$memcached = new Memcached
if ($memcached->connext('127.0.0.1', 11211)){
	if ($data = $memcached->get($key)){}
	else{
		$data = dquery($key);
		$memcached->set($key, $data, false, 90);
	}
} else{
	$data = dquery($key);
}

监控缓存命中率。理想情况下,应该为85%以上,如果缓存命中率下降,需要考虑添加更多对象服务器。


独立对象缓存

在架构中采用独立的对象缓存层。将对象缓存移到自己的服务器上。对象缓存层独立的好处是可以更好地利用内存和CPU资源,并具备可以在其他层之外独立扩展对象缓存的能力。

Created with Raphaël 2.2.0 网络服务器 应用服务器缓存 应用服务器 数据库对象缓存 数据库服务器

分离这些层的优点是可以根据对内存和CPU的要求适当地选择服务器。此外,可以在其他服务器池以外独立地扩展对象缓存池中的服务器。对象缓存通常需要大量的内存,在内存中存储对象和键,但需要相对较低的计算能力,可以据此选择合适的服务器。


想了解更多关于互联网技术架构:互联网技术架构专栏

你可能感兴趣的:(互联网技术架构,互联网技术架构)