【第374期】网站的缓存类型跟用户行为对浏览器缓存的影响
前言
节后上班第一天,早读君也回归正常的工作状态并可以有规律的更新文章了。国庆期间断了一天,哈啊~
正文从这开始~~
用户行为对浏览器缓存的影响
刷新
点击刷新按钮或者按F5,会触发这种行为。
浏览器直接对本地的缓存文件过期,但是会带上If-Modifed-Since,If-None-Match(如果上一次response带Last-Modified, Etag)这就意味着服务器会对文件检查新鲜度,返回结果可能是304,也有可能是200.
强制刷新
用户按Ctrl+F5(最开始学计算机的时候,还以为7个字母一起按呢,一直没有效果)。
浏览器不仅会对本地文件过期,而且不会带上If-Modifed-Since,If-None-Match,相当于之前从来没有请求过,返回结果是200.
地址栏回车
浏览器发起请求,按照正常流程,本地检查是否过期,然后服务器检查新鲜度,最后返回内容。
点击
和回车的效果是一样的。
网站的缓存类型
缓存用的好,大大减轻服务器压力和提升用户体验。只要涉及到缓存,肯定会存在数据更新不及时的问题。下面分为3个级别来说,越往下,说明上一级的缓存不存在或者已经失效。
第一级,浏览器缓存
优点:
这是最省资源的一种方式,浏览器甚至都不需要发起请求。
缺点:
缓存脱离控制,如果缓存时间设置太长,用户无法访问最新的页面。特别出现一个紧急BUG的时候,需要一段时间,才能平息。
使用:
在header头部添加Expires,Cache-control: max-age, Last-Modified, Etag一个或者多个头部
html代码当中,可以在meta对缓存进行控制。
建议:
JS,CSS,图片可以把缓存时间设置长久一些,永不过期都可以。文件出现变化的时候,通过添加版本号进行更新。
HTML可以根据自己的更新的速度,来设置缓存的有效期时间。
第二级,CDN缓存–静态页面
根据智能DNS解析,用户访问到最近的一台机器,这样就可以减少网络延迟。
用户访问CDN,CDN上如果资源存在并且没有过期,直接返给用户内容,否则需要先访问源站,然后保存到CDN服务器上面,然后返给用户。
优点:
1)请求分散,消弱了高流量下的压力。
2)减少了网络延迟
缺点:
1)节点资源可能缓存不一致,导致不同的用户看到的结果不一样
2)如果设置过期时间短或者其他的不合理的回源策略,会导致大量回源,导致访问速度更慢
3)高并发期间,一个资源,可能同时会有多个回源请求
4)刷新CDN,需要一段时间,如果出现BUG的话,那也得等几分钟
第三级,proxy缓存–动态页面
很多代理服务器都支持了缓存,比如Nginx,Apache。一些动态页面或者接口不怎么更新,比如产品列表等,可以把内容缓存到服务器里面,下次请求的时候,直接读取缓存,动态脚本都不需要执行。动态脚本如果要返回的话,可能需要访问数据库,以及一些其他的服务,这就增加了响应时间。
使用:
nginx,可以配置proxy_cache
apache,配置mod_cache、mod_disk_cache、mod_file_cache及mod_mem_cache
第四级,opcode缓存
是针对php代码。php执行的时候,需要先对php代码解释,生成中间代码,称为opcode,然后再执行。如果缓存住,就可以不需要每一次都解释,这样就可以节省不少资源,增加吞吐量。
优点:
节省资源,增加吞吐量
缺点:
1)代码更新,需要等待opcode失效。如果设置不过期的话,那就需要重启服务器。
2)opcode主要节省了CPU和内存资源,如果时间消耗主要是磁盘或者网络IO,那么作用不是太大。
第五级,文件缓存
会把计算或者从数据库,以及其他服务获得数据,放到一个文件里面,使用的时候取出来。常见的session就是这么做的。我看phpcms就大量使用这种缓存。
缺点:
1)多台服务器,数据缓存内容可能不一致。为了解决这个问题,曾经挂载共享代理,这就导致磁盘IO成为瓶颈。
2)设置过期时间,不太容易。
第六级,分布式缓存
为了解决文件缓存存在的问题,就出现了分布式缓存。常见的有memcache,redis.可以搭建集群,设置过期时间。redis,百度都把它当做数据存储来使用。这种缓存在互联网行业当中,大量应用。
缺点:
需要人维护,消耗大量内存,需要设置过期时间。
后语
页面缓存,早读君就联想到这一年来接触的项目都是有做页面缓存的,每次发布都要清除静态缓存,包括页面。利用这个有个好处就是如果发布有问题,至少有一层缓存可以来做缓冲保护。这种很适合资讯类的,涉及到动态的内容就略显捉襟见拙了。
关于本文
作者:万马奔腾
链接:http://www.woniubi.cn/user_browser_cache/
长按图片识别图中二维码