Web 缓存是可以自动保存常见文档副本的 HTTP 设备。使用缓存有下列优点:

• 缓存减少了冗余的数据传输, 节省了你的网络费用。
• 缓存缓解了网络瓶颈的问题。 不需要更多的带宽就能够更快地加载页面。
• 缓存降低了对原始服务器的要求。 服务器可以更快地响应, 避免过载的出现。
• 缓存降低了距离时延, 因为从较远的地方加载页面会更慢一些。

我的专栏:  HTTP学习笔记

相关问题

冗余的数据传输

冗余的数据传输会耗尽昂贵的网络带宽, 降低传输速度, 加重 Web 服务器的负载。 有了缓存, 就可以保留第一条服务器响应的副本, 后继请求就可以由缓存的副本来应对。

网络的瓶颈问题

很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽。 客户端会以路径上最慢的网速访问服务器。如果客户端从一个快速局域网的缓存中得到了一份副本, 那么缓存就可以提高性能——尤其是要传输比较大的文件时。

带宽造成的传输时延, 理想化情况(以秒为时间单位)

瞬间拥塞

缓存在破坏瞬间拥塞(Flash Crowds) 时显得非常重要。 突发事件(比如爆炸性新闻、 批量 E-mail 公告, 或者某个名人事件) 使很多人几乎同时去访问一个 Web 文档时, 就会出现瞬间拥塞。

距离时延

每台网络路由器都会增加因特网流量的时延。 即使客户端和服务器之间没有太多的路由器, 光速自身也会造成显著的时延。

命中和未命中

缓存命中、 未命中以及再验证

可以用已有的副本为某些到达缓存的请求提供服务。 这被称为缓存命中(cache hit)。

其他一些到达缓存的请求可能会由于没有副本可用, 而被转发给原始服务器。 这被称为缓存未命中(cache miss)。

原始服务器的内容可能会发生变化, 缓存要不时对其进行检测, 看看它们保存的副本是否仍是服务器上最新的副本。 这些“新鲜度检测” 被称为 HTTP 再验证(revalidation)。

成功的再验证比缓存未命中要快, 失败的再验证几乎和未命中的速度一样

只要缓存知道副本仍然有效, 就会再次将副本标识为暂时新鲜的, 并将副本提供给客户端,这被称作再验证命中(revalidate hit) 或缓慢命中(slow hit)

再验证命中:如果服务器对象未被修改, 服务器会向客户端发送一个小的 HTTP 304 Not Modified 响应。

再验证未命中:如果服务器对象与已缓存副本不同, 服务器向客户端发送一条普通的、 带有完整内容的 HTTP 200 OK 响应。

对象被删除:如果服务器对象已经被删除了, 服务器就回送一个 404 Not Found 响应, 缓存也会将其副本删除。

命中率

由缓存提供服务的请求所占的比例被称为缓存命中率(cache hit rate, 或称为缓存命中比例), 有时也被称为文档命中率(document hit rate)
缓存的管理者希望缓存命中率接近 100%。 而实际得到的命中率则与缓存的大小、缓存用户兴趣点的相似性、 缓存数据的变化或个性化频率, 以及如何配置缓存有关。
有些人更愿意使用字节命中率(byte hit rate) 作为度量值,字节命中率表示的是缓存提供的字节在传输的所有字节中所占的比例。 通过这种度量方式, 可以得知节省流量的程度。

缓存的拓扑结构

缓存可以是单个用户专用的, 也可以是数千名用户共享的。 专用缓存被称为私有缓存(private cache)。 私有缓存是个人的缓存, 包含了单个用户最常用的页面。 共享的缓存被称为公有缓存(public cache)。 公有缓存中包含了某个用户团体的常用页面。

私有缓存

私有缓存不需要很大的动力或存储空间, 这样就可以将其做得很小, 很便宜。 Web 浏览器中有内建的私有缓存——大多数浏览器都会将常用文档缓存在你个人电脑的磁盘和内存中, 并且允许用户去配置缓存的大小和各种设置。

公有缓存

公有缓存是特殊的共享代理服务器, 被称为缓存代理服务器(caching proxy server),或者更常见地被称为代理缓存(proxy cache)。 代理缓存会从本地缓存中提供文档, 或者代表用户与服务器进行联系。 公有缓存会接受来自多个用户的访问, 所以通过它可以更好地减少冗余流量。

代理缓存的层次结构

在实际中, 实现层次化(hierarchy) 的缓存是很有意义的, 在这种结构中, 在较小缓存中未命中的请求会被导向较大的父缓存(parent cache), 由它来为剩下的那些“提炼过的” 流量提供服务。

注意:

  1. 父缓存可能要更大一些, 以便装载在多用户间流行的文档, 它们还要接收来自很多子缓存的聚合流量,这些子缓存的兴趣点可能很分散,所以还需要更高的性能。
  2. 在实际中, 网络结构会尝试着将其深度限制在连续的两到三个代理以内。 但是, 新一代的高性能代理服务器会使代理链的长度变得不那么重要。

缓存的处理步骤

(1) 接收

缓存从网络中读取抵达的请求报文。高性能的缓存会同时从多条输入连接上读取数据, 在整条报文抵达之前开始对事务进行处理。

(2) 解析

缓存对报文进行解析, 提取出 URL 和各种首部。

(3) 查询

缓存查看是否有本地副本可用, 如果没有, 就获取一份副本(并将其保存在本地)。

(4) 新鲜度检测

缓存查看已缓存副本是否足够新鲜, 如果不是, 就询问服务器是否有任何更新。

(5) 创建响应

缓存会用新的首部和已缓存的主体来构建一条响应报文。

(6) 发送

缓存通过网络将响应发回给客户端。

(7) 日志

缓存可选地创建一个日志文件条目来描述这个事务。

HTTP 有一些简单的机制可以在不要求服务器记住有哪些缓存拥有其文档副本的情况下, 保持已缓存数据与服务器数据之间充分一致。 HTTP 将这些简单的机制称为文档过期(document expiration)服务器再验证(server revalidation)

缓存 GET 请求的流程图

Mr.J-- HTTP学习笔记(七)-- 缓存相关推荐

  1. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. 吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码

    吴恩达<机器学习>学习笔记七--逻辑回归(二分类)代码 一.无正则项的逻辑回归 1.问题描述 2.导入模块 3.准备数据 4.假设函数 5.代价函数 6.梯度下降 7.拟合参数 8.用训练 ...

  3. websocket 获取连接id_Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证...

    Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证 2年前 阅读 3678 评论 0 喜欢 0 ### 0.前言 前面基本的WebSocket操作,我们基本都 ...

  4. ROS学习笔记七:使用rqt_console和roslaunch

    ROS学习笔记七:使用rqt_console和roslaunch 本节主要介绍在调试时使用的rqt_console和rqt_logger_level,以及一次性打开多个节点的工具roslaunch. ...

  5. 【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练

    [K210]K210学习笔记七--使用K210拍摄照片并在MaixHub上进行训练 前言 K210准备工作 K210如何拍摄照片 准备工作 拍摄相关代码定义 用K210拍摄到的照片在MaixHub平台 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  7. window的dos命令学习笔记 七

    文章目录 一.dos历史学习笔记(后期整合到这里,我想能学到这里的应该不多了,嘿嘿,加油) 二.执行状态返回值(`%errorlevel%`,和shell中`$?`相似): 三.视窗 1.color ...

  8. ESP32学习笔记(七) 复位和时钟

    ESP32学习笔记(七) 复位和时钟 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介绍 ...

  9. 逆向脱壳破解分析基础学习笔记七 堆栈图(重点)

    本文为本人 大神论坛 逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出. 陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步 堆栈图 首先给定一段反汇 ...

  10. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

最新文章

  1. Android 屏幕常亮、低电量监听
  2. JavaScript基础12-day14【DOM查询(获取元素节点、获取元素节点的子节点)、全选练习、DOM增删改、DOM添加删除记录、Window对象方法】
  3. 工业路由器和工业交换机的区别介绍
  4. 微信小程序阻止冒泡点击_微信小程序bindtap事件与冒泡阻止详解
  5. React之组件小析
  6. SQL基础笔试题(六)
  7. 吴恩达神经网络和深度学习-学习笔记-42-目标检测
  8. 30个要点帮你完成java代码优化
  9. 计算机底层逻辑无法仿造大脑,重塑世界的底层逻辑|读《终极算法》
  10. idea实现远程调试
  11. Java程序员的职业规划
  12. asp.net接受表单验证格式后再提交数据_药物临床试验数据管理与统计分析的计划和报告指导原则...
  13. delphi 运算符
  14. 美丽汤的请求 - 小甜饼豆瓣爬虫
  15. 深入理解计算机系统(第三版)家庭作业 第九章
  16. 报错 Duplicate keys detected
  17. Learn Python The Hard Way (python 2.7) ex45.py 你来制作一个游戏
  18. IJCAI-18 阿里妈妈搜索广告算法大赛亚军解决方案
  19. java小易——Servlet轻量级服务
  20. 从血红细胞衰老看中老年疑难病和亚健康--

热门文章

  1. 2018年12月精选文章目录一览
  2. windows下使用word2vec训练维基百科中文语料全攻略!(三
  3. OpenCV人脸识别之三:识别自己的脸
  4. caffe to pytorch
  5. 基础知识(四)Dijkstra算法
  6. java restsharp_C# RestSharp应用
  7. java静态类如何赋值_Java class对象说明 Java 静态变量声明和赋值说明
  8. c语言五子棋评估函数,简易五子棋评估函数
  9. python 超参数_OpenCV python sklearn随机超参数搜索的实现
  10. java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...