目录
简介
在Web开发中,缓存可分为客户端浏览器缓存、服务器端前端缓存、应用层缓存、数据库缓存。
缓存的主要作用有:
- 加快页面打开速度。
- 减少网络带宽消耗。
- 降低服务器压力。
客户端浏览器缓存
客户端浏览器端缓存规则主要是在HTTP协议头【Expires、Cache-Control等消息报头】和HTML的meta标签中定义。
使用HTTP头信息来控制缓存比使用HTML的meta标签来控制缓存更有效,使用得也更加广泛,因为只有部分浏览器支持通过HTML的meta标签来设置缓存,而且缓存代理服务器都不支持通过HTML的meta标签来设置缓存【代理不解析HTML内容本身】。
客户端浏览器会从过期机制和验证机制两方面去判断是直接使用缓存中的副本,还是去从源服务器获取更新版本的文件。
过期机制是指缓存副本有效期。
验证机制是指服务器返回资源时,有时会在控制头信息里带上这个资源的实体标签Etag【Entity Tag】,作为浏览器再次请求过程中的校验标识。如果校验标识不匹配,则说明资源已经被修改或者过期,需要重新获取服务器资源内容。
浏览器缓存可分为强缓存和协商缓存。强缓存不会发请求到服务器,协商缓存会发请求到服务器。
当用户发起一个服务器静态资源请求时,浏览器会通过以下三步来获取资源。
- 本地缓存阶段。浏览器在加载资源时,会先根据这个资源的一些请求头信息判断它是否可用缓存,如果可用缓存就查找该资源的本地缓存文件,如果找到了就直接使用,不会发http请求到服务器【强缓存】。
- 协商缓存阶段。若该资源可用缓存,并且查找到了该资源的本地缓存文件,但不知道该资源是否过期,就发一个http请求到服务器,服务器收到请求后判断该资源是否过期【修改过就过期了】,没有过期就返回304状态码,让浏览器使用本地找到的那个资源缓存文件。
- 缓存失败阶段。当服务器发现请求的资源已经修改过,或者发现是一个新的请求【客户端本地没有找到请求资源的缓存文件】,服务器会查找服务器上存放的该客户端请求里请求的资源,找到了就会返回该资源的数据,并将HTTP响应的状态行里的HTTP状态码设置为200。如果没有找到资源,HTTP响应的状态行里的HTTP状态码会被设置为404。
当按Ctrl+F5强制刷新页面时,浏览器会绕过本地缓存阶段和协商缓存阶段,直接向服务器请求最新的资源。
当按F5或者点击浏览器的刷新按钮来刷新页面时,浏览器会绕过本地缓存阶段,将请求发送到服务器【协商缓存阶段】。
当点击浏览器的返回上一页按钮,或者对浏览器地址栏里的URL按回车键,会正常按步骤获取资源。
服务器端前端缓存
服务器前端缓存是指将前端资源内容缓存在本地服务器,或者缓存服务器【CDN】。主要针对静态文件类型,如图片、css、js、html等静态文件。
将动态页面直接生成静态的页面放在服务器端,这样当用户调取相同页面时,能直接下载静态页面到客户端,不再需要运行动态网页程序和访问数据库,可以大大节约服务器的负载。
应用层缓存
应用层缓存的架构可以分为以下两种:
- 嵌入式。缓存和应用在同一台机器上,例如单机的文件缓存。
- 分布式。把缓存数据独立到不同的机器,通过网络来请求数据,如memcache。
应用层缓存的实例有:
- 缓存数据库的查询结果,减少数据库压力,这是大型网站必做的。
- 缓存磁盘文件的数据,将常用的数据放到内存,这样不必每次都去读磁盘,如中文分词的词库。
- 缓存耗时的计算操作,如数据统计。
数据库缓存
数据库缓存一般由数据库提供。为了提高查询效率,数据库软件会在内存划分出一个专门的区域来存放用户最近执行的查询,这块区域就是数据库缓存区域。