Web缓存机制
- Web缓存的作用:
- 减少网络宽带消耗
- 降低服务器压力
- 减少网络延迟,加快网页打开速度
- Web缓存分为
- 浏览器缓存
- 服务器缓存
- 数据库缓存
1、 浏览器缓存
- HTTP
- 基于http协议的浏览器文件缓存机制,当重复请求某一个文件时,浏览器可以根据协议的头文件判断是从服务器端请求文件还是从本地读取文件。
- 浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应**header**中。
- **强缓存**和**协商缓存**
- 强缓存
- header中有两个来标明失效规则:Expires/Cache-Control
- Expires
缓存过期时间。 Expires = max-age(缓存在xxx后失效) + 请求时间,需要和 Last-modified 结合使⽤。
- Cache-Control(优先级高于Expires)
常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private:客户端可以缓存
public:客户端和代理服务器都可缓存
max-age=xxx 过期时间
no-cache: 不适用强缓存
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发
- 协商缓存
- 服务器根据HTTP头信息中的 Last-Modified/If-Modified-Since 或者 Etag/If-None-Match 来判断是否命中 协商缓存。
- 过程:发请求-->看资源是否过期-->过期-->请求服务器-->服务器对比资源是否有改动过-->没改动-->返回304状态码-->客户端用缓存。
- Etag(优先级⾼于 Last-Modified)
- 服务器⾃动⽣成或者由开发者⽣成的对应资源在服务器端的唯⼀标识,能够更加准确的控制缓存。
- 使用Etag的优点
- 某些文件进行周期性的修改,内容不发生改变,但是时间改变了,这时候并不希望客户点认为文件已经被修改
- 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),if-modified-since能检查到的粒度是秒级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
- 某些服务器不能精确的得到文件的最后修改时间,或者与代理服务器时间不⼀致等情形,Etag 能表⽰该文件的内容是未修改的
- 怎么配置资源的缓存规则
- 1、服务器配置
- 2、nginx中配置
- LocalStorage
- 以键值对形式存储数据。
- 没有时间限制
- 最大可储存5M
- SessionStorage
- 以键值对形式存储数据
- 会话级别的数据存储,关闭会话即消失
- 最大储存5M
- Cookie
- 名/值对的形式,即 name=value,名称和值都必须是URL编码的,且两对cookie间以分号和空格隔开
- 一般由服务器生成,浏览器进行存储,浏览器再次向服务器发送请求时,则会带上此cookie
- 属于会话级别
- 存有关访问者的信息
- 1、保存用户登录信息
- 2、创建购物车
- 3、跟踪用户行为
- 最大存储4KB
- indexDB
- IndexedDB 是一种低级API,用于客户端存储大量结构化数据。该API使用索引来实现对该数据的高性能搜索。
2、服务器缓存
- 业务服务器缓存
- 业务服务器缓存是将动态页面直接生成静态的页面放在服务器上的硬盘里,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。
- 代理服务器缓存
- 代理服务器是客户端和业务服务器之间的中间服务器,客户端先向这个中间服务器发起请求,经过处理后,再将请求转发到业务服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少相应时间和带宽使用方面很有效,同一个缓存数据会被重复使用多次。
3、数据库缓存
- 由数据库提供,可以对数据表建立的⾼速缓存
- Redis
- 把整个数据库全加载到内存当中进行操作,通过异步操作定期把数据库数据 flush到硬盘上保存。
这些大概是我了解的有关Web缓存的相关内容,如有不全和不对的地方,还请各位大佬提出以及指正!