web缓存技术

来源:互联网 发布:用c语言写九九乘法表 编辑:程序博客网 时间:2024/06/07 07:07

web缓存包括浏览器缓存,数据库缓存,代理服务器缓存。

代理服务器缓存

反向代理服务器,在数据转发过程中,可以缓存一些数据,以提高响应速度。
这个了解的不多,不多写了。

数据库缓存

我们可以将一些读取非常频繁的数据,比如访问次数,表单中显示的数据等,存储在redis,memcached等基于内存的nosql数据库中,作为缓存,提高响应速度。

读取缓存失败时,将会从mysql中取数据,并设置redis相应的数据库缓存。
当更新mysql数据库时,也更新redis相应的数据库缓存。

还有一种是语言层面的缓存,我们可以将一些访问量大,但更新不很频繁的页面,生成html文件。每当我们更新数据时,就重新生成一次html页面,这适用于首页和关于我等页面,因为是html页面,不需要动态执行,也不需要从数据库取数据,所以访问速度很快。可以通过php的ob函数获取输出缓存中的数据,然后使用file_put_content函数生成html页面。

HTTP缓存

HTTP缓存(浏览器缓存)一般是在服务器中设置的,也可以通过页面的HTTTP-EQUIV属性设置。
这里写图片描述

HTTP缓存设置的优先级
这里写图片描述
就算我们不在服务器配置HTTP缓存,现代的浏览器也会通过使用自己的算法进行缓存,不过缓存的时间一般比较短。

nginx服务器配置HTTP缓存

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${    root /var/www/nginx;    expires      7d;}

这里写图片描述

以css文件为例
max-age的优先级高于Expires,表示在7d之内,该缓存文件都是“新鲜”的;超过7d,该缓存文件就是“过期”的。

浏览器每次请求一个文件时,会先检查是否存在本地缓存。

如果没有缓存,则向服务器发送请求,服务器返回200 ok,下载该文件到本地。

如果本地有缓存,则进一步检查缓存是否“新鲜”

如果缓存“新鲜”,就直接从缓存中取数据,并不会向服务器发送请求。
如果缓存“过期 ”,则需要向服务器发送请求,检查该缓存是否需要替换,如果服务器文件没有修改,则不需要替换,服务器返回304 not modified,并将缓存续期7d;如果服务器文件已修改,则下载新的文件,覆盖原来的缓存文件,服务器返回200 ok,新缓存也是7d后“过期”。

no-cache和no-store

这里写图片描述

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${   root /var/www/nginx;   add_header Cache-Control no-store;}

由于浏览器默认会使用缓存,所以我们想让浏览器不使用缓存的话,需要设置Cache-Control:no-store
这里写图片描述

还有一种情况就是,我们修改了服务器上的css文件,由于该css文件的max-age还没有到期,所以浏览器默认会从本地缓存中获取该css文件,并知道服务器上的文件已经修改。这时,用户看到的样式就是旧的css文件显示的样式,通常需要刷新一下页面(强制将max-age置为0),才能看到新的样式。

 location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {     root /var/www/nginx;     add_header Cache-Control no-cache;     expires 7d; }

我们可以在服务器上设置Cache-control:no-cache,它表示浏览器不能直接使用本地的缓存文件,必须向服务器发送请求验证该文件是否被修改过,如果被修改过则需要下载新的文件进行替换。这种方法能够保证用户看到的页面都是最新的,但是服务器要处理更多的验证请求,如果文件没有修改,则服务器返回一个header为304 Not Modified,body为空的响应。

这里写图片描述

F5刷新浏览器

上面介绍的,只有本地缓存“过期”的时候,才会向服务器发送请求,检查本地缓存是否需要替换。F5操作会将max-age置0,立即向服务器发送缓存检查的请求。
服务器通过请求头中的If-Modified-SinceIf-None-Match和服务器文件中的Last-ModifiedETag进行比对,如果一致则说明文件没有过期,返回状态码304 not modified;如果不一致,说明服务器文件修改过,返回状态码200 ok,下载新的文件覆盖缓存。

这里写图片描述

ctrl+F5强制刷新浏览器

强制刷新是强制浏览器从服务器获取新的数据覆盖本地缓存的操作。
头文件不包含本地缓存信息,重新下载服务器上的最新文件,替换原来的缓存,服务器返回200 ok

这里写图片描述

测试时,要注意刷新和正常点击链接进行的页面跳转,使用缓存的顺序是不同的。

参考文章:

《HTTP权威指南》

http://web.jobbole.com/85243/

0 0