缓存及其分类

缓存:存储在计算机上的一个原始数据复制集。

根据在软件系统中所处的位置不同,缓存可以分为:客户端缓存、网络层缓存和服务端缓存。

根据部署方式不同,缓存可以分为:单体缓存、集群缓存、分布式缓存。

1、客户端缓存

1.1、页面缓存

页面缓存是将之前访问过的页面,保存为本地文件,作为离线应用缓存。当用户再次访问时,可以避免网络连接,从而减少服务器及网络负载,提升性能和用户体验。

HTML5中使用页面缓存的示例代码如下:

localStorage.setItem(“key”,”value”)
localStorage.getItem(“key”,”value”)
localStorage.removeItem(“key”)
localStorage.clear()

开启离线缓存的步骤如下:

1)准备用于描述页面需要缓存的资源列表清单文件(manifest text/cache-manifest)。

2)在需要离线使用的页面中添加manifest属性,指定缓存清单文件的路径。

离线缓存的工作流程如下:

1)当浏览器首次访问包含manifest属性的页面,在页面加载之后,获取所有在清单文件中列出的文件,生成初始缓存。

2)再次访问时,浏览器会直接从应用缓存中加载页面及在清单文件中的资源。同时,浏览器想window.applicationCache对象发送一个表示检查的事件,以获取清单文件。

3)如果当前缓存的清单副本是最新的,浏览器将向window.applicationCache对象发送一个表示无须更新的事件,结束更新过程。如果服务器端修改了任何缓存资源,必须同时修改清单文件,这样浏览器才能知道要重新获取资源。

4)如果清单文件已更新,清单中列出的所有文件将会被重新获取到一个临时缓存中。对于每个加入临时缓存的文件,浏览器会想window.applicationCache对象发送一个表示进行中的事件。

5)当所有文件都获取成功,他们会自动转移至真正的离线缓存中,并向window.capplicationCache发送一个表示已经缓存的事件。

1.2、浏览器缓存

首次页面请求之后,浏览器在磁盘上专门开辟空间来存储资源副本作为缓存。当用户触发“后退”或者点击之前浏览过页面的时候,浏览器会直接从缓存中读取该资源并展示。

HTTP1.0提供了基本的缓存特性,例如在服务器端设置Expires的HTTP头来告知客户端在重新请求文件之前缓存多久是安全的,可以通过if-modified-since的条件请求来使用缓存。其中,发送的时间是文件最初被下载的时间,而不是即将过期的时间。如果文件没有改变,服务器会返回304-Not Modified应答。客户端收到304代码,就可以使用缓存的文件版本了。

HTTP1.1引入了实体标签e-tag,e-tag是文件或者对象的唯一标识。当请求一个资源,询问服务器这个资源是否有变化,如果e-tag是有效的,服务器就会生成304应答,否则会发送200应答。

 

HTTP Cache工具:

1)Last-Modified
首次请求的响应头返回Last-Modified,时间格式如:Wed, 22 Jul 2009 07:08:07 GMT,是零时区的 GMT 时间。

Last-Modified 与 If-Modified-Since 对应的,前者是响应头,后者是请求头。服务器要处理 If-Modified-Since 请求头与 Last-Modified 对比看是否有更新,如果没有更新就返回 304 响应,否则按正常请求处理。如果要在动态内容中使用它们,那就要程序来处理了。

2)Etag
如果不能用时间确定内容是否有更新,可以使用etag头,etag 是以内容计算一个标识。计算的方式可以自己决定,比如可以用 crc32、md5等。

Etag 与 If-None-Match 是对应的,前者是响应头,后者是请求头。服务器要判断请求内容计算得到的 etag 是否与请求头 If-None-Match 是否一致,如果一致就表示没有更新,返回 304 就可,否则按正常请求处理。

3)Expires
当请求的内容有 Expires 头的时候,浏览器会在这个时间内不去下载这个请求的内容。

4)max-age 的 Cache-Control
max-age 的值表示,多少秒后失效,在失效之前,浏览器不会去下载请求的内容

总结:

Last-Modified 与 Etag 头(即是方式 1 和2)还是要请求服务器的,只是仅返回 304  头,不返回内容。所以浏览怎么 F5 ,304 都是有效的。但用 Ctrl+F5 是全新请求的。

Expires 头与 max-age 缓存是不需要请求服务器的,直接从本地缓存中取。但 F5 会忽视缓存。

用户的浏览器操作对缓存的影响如下:

用户行为

Expires/Cache-control

Last-Modifed/Etag

地址栏回车

Y

Y

链接跳转

Y

Y

新开窗口

Y

Y

前进后退

Y

Y

F5刷新

N

Y

Ctrl+F5刷新

N

N

如果在html中加入如下meta标签,可以告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。

<meta http-equiv=”Pragma” content=”no-cache”>

1.3、app缓存

App使用数据库缓存的方法,在首次下载数据之后,把文件相关信息,如:url、路径、下载时间、过期时间等存入数据库,下次下载的时候,根据url先从数据库中查询,如果查询到当前时间未过期,就根据路径读取本地文件,实现缓存效果。

需要注意的是,不同类型文件的缓存时间不一样。例如:图片文件相对不变,直至最终被清理,app会永远读取缓存中的图片内容。配置文件是可更新的,需要设置一个可接受的缓存时间。

不同网络环境下缓存时间标准也不一样,wifi环境下,缓存时间可以短一点。移动网路下,缓存时间可以设置较长。

2、网络层缓存

2.1、Web代理缓存

常用的web代理分为:正向代理、反向代理和透明代理。Web代理缓存,说的是正向代理中的场景。

当浏览器通过代理服务器访问网页的时候,有代理服务器来取回浏览器所需要的的信息并传给浏览器。Web代理有很大的存储空间,可以将获取到的数据存储在本地的存储上。当代理服务器上保存了浏览器所需的最新的信息,浏览器就可以直接获取到缓存的数据,显著提高浏览速度和效率。

2.2、边缘缓存

边缘缓存最典型的示例就是CDN(Content Delivery Network),即“内容分发网络”。

当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,如果缓存数据并没有过期,则直接返回数据;反之,CDN节点会向源站点回源请求,拉取最新数据,更新本地缓存,并将最新数据返回给客户端。

3、服务端缓存

3.1、数据库缓存

使用查询缓存机制的数据库,例如mysql,它会将select语句和查询结果存放在缓存区,对于之后进行查询相同的select语句,将直接从缓存区读取结果,可以提升查询效率。

查询缓存仅针对select语句,当mysql打开Query Cache功能,mysql在接收到一条select语句的请求后,会根据预设的hash算法,将接收到的select语句以字符串的方式进行hash,然后到Query Cache中查找是否已经缓存。如存在缓存,直接返回数据,跳过了解析,优化和执行阶段。 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效。

查看当前版本是否支持Query Cache功能:

SHOW VARIABLES LIKE 'have_query_cache';

若显示YES,则支持;反之不支持

另外,SQL_NO_CACHE可以指定select语句不走Query Cache,示例如下:

SELECT SQL_NO_CACHE * from study;

3.2、应用缓存

以如下应用系统架构图为例,详解多级缓存的工作细则。

 

1)请求被负载均衡(F5硬件附件均衡或者Nginx负载均衡功能)服务分发到Nginx(此处采用的是Nginx的缓存功能)上,常用的负载均衡方法有轮询或者一致性哈希。轮询可以使请求更加均衡,一致性哈希可以提升Nginx应用的缓存命中率。

2)Nginx应用器读取本地缓存,如果命中本地缓存则直接返回。Nginx应用服务器使用本地缓存可以提升整体的吞吐量,降低后端的压力。

3)如果Nginx应用服务器的本地缓存没有命中,就会读取redis分布式缓存的集群,如果命中,则直接返回数据,并会写Nginx应用服务器的本地缓存。

4)如果redis分布式缓存集群没有命中,则读取Tomcat集群,Tomcat集群首先会读取本地平台级缓存,如果命中,则直接返回数据,并依次更新层级之上的各级缓存,

5)如果Tomcat集群没有命中,则读取数据库,数据库服务本身也有缓存机制。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值