缓存命中和缓存未命中

========================摘自《HTTP权威指南》==============================

1、缓存命中和缓存未命中

可以用已有的副本为某些到达缓存的请求提供服务,这被称为缓存命中(cache-hit)参见图7-4a。其他一些到达缓存的请求可能会由于没有副本可用,而被转发给原始服务器,这被称为缓存未命中(cache-miss)参见图7-4b。

(1)、再验证

原始服务器的内容可能会发生变化,缓存要不时的对其进行检测,看看它们保存的副本是否仍是服务器上最新的副本。这些“新鲜度检测”被称为HTTP再验证(revalidation)参见图7-4c。为了有效的进行再验证,HTTP定义了一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测出内容是否是最新的。

缓存可以在任意时刻,以任意频率对副本进行再验证。但由于缓存中通常会包含数百万的文档,而且网络宽带是很珍贵的,所以大部分缓存只有在客户端发起请求,并且副本旧的足以需要检测的时候才会对副本进行再验证。

缓存对缓存的副本进行再验证时,会向原始服务器发送一个小的再验证请求。如果内容没有变化,服务器会以一个小的304Not Modified进行响应。只要缓存知道副本仍然有效,就会再次将副本标识为暂时新鲜的,并将副本提供给客户端,见图7-5a,这杯称为再验证命中(revalidation hit)或缓慢缓慢命中(slow hit),这种方式确实要与原始服务器进行核对,所以要比单纯的缓存命中要慢,但它没有从原始服务器中获取对象数据,所以要比缓存未命中要快一些。

HTTP为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的是If-Modified-Since首部。将这个首部添加到GET请求中去,就可以告诉服务器,只有在缓存了对象的副本之后,又对其进行修改了情况下,才发送此对象。

这里列出了在3种情况下(服务器内容未被修改,服务器内容已被修改,或者服务器上的对象被删除了)服务器收到GET If-Modified-Since请求时会发生的情况:

A、 再验证命中

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

B、 再验证未命中

如果服务器对象与缓存副本不同服务器会向客户端发送一条普通的、带有完整内容的HTTP 200 oK响应;

C、 对象被删除

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

(2)、命中率

由缓存提供服务的请求所占的比例被称为缓存命中率(cache hit rate或称为缓存命中比例),有时也被称为文档命中率(document hit rate)。命中率在0到1之间,但通常用百分数来描述的,0%表示每次请求都未命中(要通过网络来获取文档),100%表示每次请求都命中了(在缓存中有一份副本)。

缓存的管理者希望缓存命中率接近100%。而实际得到的命中率则与缓存的大小、缓存用户兴趣点的相似性、缓存数据的变化或个性化频率,以及如何配置缓存有关。命中率很难预测,但对现在中等规模的web缓存来说,40%的命中率是很合理的。缓存的好处是,即使是中等规模的缓存,其所包含的常见文档也足以显著的提高性能、减少流量了。缓存会努力确保将有用的内容保存在缓存中。

(3)、字节命中率

由于文档并不全是统一尺寸的,所以文档命中率并不能说明一切。有些大型对象被访问的次数比较少,但由于尺寸的原因,对整个数据流量贡献却更大。因此,有些人更愿意用字节命中率(byte hit rate)作为度量值(尤其那些按流量字节付费的人)。

字节命中率表示的是缓存提供的字节在传输的所有字节中所占的比例。通过这种度量方式,可以得知节省流量的程度。100%的字节命中率说明每个字节都来自缓存,没有流量流到因特网上。

文档命中率和字节命中率对缓存性能的评估都是很有用的。文档命中率说明阻止了多少通往外部的web事务。事务有一个通常很大的固定时间成分(比如,建立一条到服务器的TCP连接),提高文档命中率对降低整体延迟(时延)很有好处。字节命中率说明阻止了多少字节传向因特网。提高字节命中率对节省宽带很有利。

(4)、区分命中和未命中的情况

不幸的是,HTTP没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的。在这两种情况下,响应码都是200OK,说明响应有主题部分。有些商业代理缓存会在Via首部附加一些额外信息,以描述缓存中发生的情况。

客户端有一种方法可以判断响应是否来自缓存,就是使用Date首部。将响应中Date首部的值与当前时间进行比较,如果响应中的时间比较早,客户端通常就可以认为这是一条缓存的响应。客户端也可以通过Age首部来检查缓存的响应,通过这个首部可以分辨出这条响应的使用期。

HTTP之缓存命中的更多相关文章

  1. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...

  2. memcache缓存命中深入理解转载

    http://www.iteye.com/topic/225692 memcache的方法有 add,set,replace,get,delete,getstats,increment,decreme ...

  3. 走进缓存的世界(三) - Memcache

    系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...

  4. 前端学HTTP之缓存

    前面的话 Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关内容 功能 ...

  5. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  6. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  7. 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

    在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...

  8. HTTP缓存

    本文是<HTTP权威指南>读书笔记 Web缓存是可以自动保存常见文档副本的设备.当Web请求抵达缓存时,如果本地在“已缓存”的的副本,就可以从本地存储设备而不是原始服务器中提取这个文档.使 ...

  9. 缓存淘汰算法--LRU算法

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...

随机推荐

  1. Linux查看日志常用命令(转载)

    转自: https://www.cnblogs.com/kbkiss/p/7567725.html -------------------------------------------------- ...

  2. 在Visual Studio 2019中开启预览功能

    在Visual Studio 2019 菜单 [工具] > [选项] > [环境] 下的预览功能页面焕然一新!我们介绍了预览功能页面,以便您可以轻松找到这些功能并能够控制其启用.新布局提供 ...

  3. curl命令查看时间信息

    参考:https://blog.csdn.net/jackyzhousales/article/details/82799494 示例:curl www.baidu.com -w "time ...

  4. IDEA创建父模块与子模块

    1.IDEA点击New Project 2.点击+: 3.在[project]包下新建一个模块Moudle,名叫(springcloud)//root模块 4.继续添加模块Initializr持续ne ...

  5. 高强度学习训练第一天总结:Java内存区域

    ---恢复内容开始--- 程序计数器: 程序计数器(Program Counter Register) 是一块较小的空间,他可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念 ...

  6. javascript 关于赋值、浅拷贝、深拷贝的个人理解

    关于赋值.浅拷贝.深拷贝,以前也思考良久,很多时候都以为记住了,但是,我太难了.今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 一.栈.堆.指针地址 栈内存 ...

  7. 对cell每一行做标记

    通过数组进行标记 初始化列表的时候给一个值如 for (int i = 0; i < [self.tableData count]; i++)    {        [_allOrderBoo ...

  8. python_机器学习_最临近规则分类(K-Nearest Neighbor)KNN算法

    1. 概念: https://scikit-learn.org/stable/modules/neighbors.html 1. Cover和Hart在1968年提出了最初的临近算法 2. 分类算法( ...

  9. nodejs实现简单爬虫

    nodejs结合cheerio实现简单爬虫 let cheerio = require("cheerio"), fs = require("fs"), util ...

  10. 201871010126 王亚涛 《面向对象程序设计JAVA》第十四周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11 ...