一般减少数据读取时间方法
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客户端缓存文件;
这是第二次请求图片
虽然动态脚本文件对于客户端来说没有修改时间一说,但是可以通过代码修改响应头中的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;
}
}