http 缓存分为客户端缓存和服务端缓存

1. 客户端缓存

客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加快请求速度

2. 服务器缓存

服务器缓存指的是反向代理服务器或 cdn 缓存, 他的作用是用于减轻实际的 web server 的压力.

缓存生效都是通过 header 来控制的

1. Expires

如果 repsonse 中带有 Expires=date, 则表示这个 response 可以由 浏览器/CDN 保存至 date 日期, 在到达 date 日期之前, 都可以直接提供给请求方, 对于浏览器缓存来说, 则可以不必发请求, 对于反向代理服务器来说, 则可以不用请求原始 server

2. Cache-Control

Cache-Control 的值有很多, 最常用的是 max-age, 如果 response 带有 max-age, 则表示从现在起到 max-age 之前, 这个 repsonse 都可以作为缓存使用

Server 的 Cache-Control
1. no-store, 提示客户端应该删除这个缓存
2. no-cache, 提示客户端在重新验证这个缓存之前不应该使用
3. max-age, 表示缓存的新鲜时间, 在此时间内可以不发送 http 请求去验证缓存而直接使用它, 如果 max-age=0. 则表示要求不要缓存文档
4. s-maxage, 功能与 max-age 相同, 但只对共享缓存生效(CDN, 反向代理)

Client 的 Cache-Control
1. max-stale, 可以使用过期缓存
2. max-stale=s, 在 s 秒内, 缓存可以过期
3. min-fresh=s, 在 s 秒内, 缓存不能过期
4. max=age=s, 缓存的 age 必须小于 s 秒 
5. no-cache, 除非资源进行再验证, 否则不接受缓存
6. no-store, 表示反向代理服务器不应该缓存这个请求的 response
7. only-if-cached, 只想要已缓存的数据, 否则返回 504

如果 Cache-Control 的 max-age 与 Expires 同时存在, 则 max-age 优先

3. Last-Modified/If-Modified-Since

如果 response 带有 Last-Modified, 则 request 在 Expires 跟 Cache-Control 的缓存过期后, 可以使用将 Last-Modified 的时间带到 request header If-Modified-Since 里, 去 server 端校验缓存是否改变, 如果  server 回复 304, 则可以继续使用本地缓存

4. ETag/If-None-Match

如果 response  带有 ETag, 则 request 在 Expires 跟 Cache-Control 的缓存过期后, 可以将 Etag 的值带到 request header If-None-Match, 如果  server 回复 304, 则可以继续使用本地缓存

5. ETag & Last-Modified

如果 response 同时包含 ETag 与 Last-Modified, 则 request 需要同时发送 If-Modified-Since 和 If-None-Match, 并且 server 需要两者同时校验通过才返回 304.

http 缓存分为客户端缓存和服务端缓存相关推荐

  1. 教你编写Node.js中间件,实现服务端缓存

    Express 作为 Node.js 的框架,如今发展可谓如日中天.我很喜欢其灵活.易扩展的设计理念.尤其是该框架的中间件架构设计:使得在应用中加入新特性更加标准化.成本最小化.这篇文章,我会尝试编写 ...

  2. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  3. 客户端渲染和服务端渲染

    参考链接:客户端渲染和服务端渲染的区别https://blog.csdn.net/qq_40885461/article/details/88539989 浅谈服务端渲染(SSR)https://ww ...

  4. grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用

    上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...

  5. 解决android客户端上传图片到服务端时,图片损坏的问题

    解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...

  6. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  7. 附件统一处理starter,含附件客户端和附件服务端

    文章目录 附件统一处理starter,可分别作为附件客户端和附件服务端使用 一 关于项目中附件的概述 二 概要描述 三 附件starter功能划分 3.1 附件服务器,真实的存储附件 3.1.1 为前 ...

  8. AjaxPro.NET使用,方便的在客户端直接调用服务端方法

    (一). 运行效果如下: (二). AjaxPro.NET简介 AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL引用并进行简单的配置, 即可以非常方便的在客户端直接调用服 ...

  9. C# 客户端Client与服务端Server通信

    C# 客户端Client与服务端Server通信 服务端配置 服务端要先启动,等待客户端请求连接 客户端配置 客户端测试**(切记一定要先开启服务端,不然不能保证连接)**

最新文章

  1. linux insight 使用教程,Insight API开源项目分析
  2. htpdate代替ntpdate同步时间
  3. Windows server 2003 体系结构
  4. 深度解密 Go math/rand
  5. python微博热点_用 Python 监控知乎和微博的热门话题
  6. 从源代码角度看Struts2返回JSON数据的原理
  7. LeetCode MySQL 1607. 没有卖出的卖家
  8. 领域应用 | 从本体论开始说起——运营商关系图谱的构建及应用
  9. 学习廖雪峰的git教程6--版本控制
  10. 我发现有的人就活该他赚钱,他们的脑子就是个聚宝盆
  11. C++ 模板双向不循环链表!!
  12. java中typeof_深入剖析JavaScript中的数据类型判断(typeof instanceof prototype.constructor)...
  13. adb 操作命令简介(一)
  14. ESIX群晖NAS安装教程
  15. postman并发测试_PostMan接口压力测试
  16. 两种自动化测试工具AutoRunner与Selenium的对比
  17. 家用计算机音效部件图示,唱吧新版自定义音效设置方法(附上最佳音效设置参数图)...
  18. 面试备战笔记2019
  19. python输出奇数个数_Python实践|输出0-7组成八位奇数总数
  20. 解决阿里云盾控制台wordpress IP验证不当漏洞

热门文章

  1. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四
  2. 可变车道怎么走不违章_可变车道怎么才能正确通行?老司机来告诉你什么才是正确的走法。...
  3. C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)
  4. td里面字体大小怎么改_王者荣耀战区怎么改到其他地方 2020荣耀战区修改方法...
  5. centos7通过yum升级内核到最新版本
  6. 深入浅出Rust-Future-Part-5.md
  7. 面试 6:调整数组顺序使奇数位于偶数前面
  8. json和pickle模块
  9. 一台机器同时启动两个tomcat
  10. IP地址的划分和配置路由