利用HTTP协议和浏览器缓存,减少数据读取时间

一般减少数据读取时间方法

1.合理建立关系型数据库索引

2.合理利用NOSQL数据库(如redis)存储数据,可以做到随机读取

3.利用缓存机制,把查询速度慢或者计算量比较大的结果集存储起来,并适当设置过期时间

4.优化SQL语句

其他方法,说明一下

众所周知,大多数浏览器客户端,为了减少网络延时,会利用本地缓存来加快二次加载的速度

缓存的对象一般有:媒体文件(jpg,gif等),样式文件,脚本文件等。

脚本文件运行所产生的文本其实也可以算是普通文本,那么对于实时性要求低的数据请求,我们绝对可以利用浏览器缓存来帮我们解决问题。

利用ETag响应头,返回304(not modified)

下面说明一下ETag的机制

====第一次请求===

1.客户端发起 HTTP GET 请求一个文件;

2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200

====第二次请求===

1.客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d044840

2.服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使本地缓存;


利用Modified-Since响应头,返回304(not modified)

下面说明一下Modified-Since的机制

====第一次请求===

1.客户端发起 HTTP GET 请求一个文件;

2.服务器处理请求,返回文件内容和一堆Header,当然需要包括Modified-Since(例如Thu, 01 Sep 2016 11:19:33 GMT).状态码200

====第二次请求===

1.客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-Modified-Since头,这个头的内容就是第一次请求时服务器返回的If-Modified-Sinc:Thu, 01 Sep 2016 11:19:33 GMT

2.服务器判断发送过来的If-Modified-Since和文件Modified-Since的匹配,如果相等服务器返回304客户端利用缓存,否则返回200客户端缓存文件;

这是第二次请求图片

利用HTTP协议和浏览器缓存,减少数据读取时间_第1张图片

虽然动态脚本文件对于客户端来说没有修改时间一说,但是可以通过代码修改响应头中的Modified-Since属性,使动态脚本文件缓存能够被客户端直接缓存起来,直接减少网络请求时间。

下面是从网上摘抄的一段代码,同学们可以借鉴一下

private function _addEtag($file) {

        $last_modified_time = filemtime($file);

        $etag = md5_file($file);

        // always send headers

        header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");

        header("Etag: $etag");

        // exit if not modified

        if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||

        @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {

                header("HTTP/1.1 304 Not Modified");

                exit;

        }

}

你可能感兴趣的:(利用HTTP协议和浏览器缓存,减少数据读取时间)