http --- 緩存

Web緩存:

// 是可以自動保存常見文檔副本的HTTP設備.
// 當Web請求抵達緩存時,如果本地有"已緩存的"副本,就可以從本地存儲設備而不是原始服務器中提取這個文檔.

冗余的數據傳輸:

// 有很多客戶端訪問一個流行的原始服務器頁面時,服務器會多次傳輸同一份文檔
// 每次傳遞給一個客戶端.這樣一些相同的字節會在網絡中一遍遍的傳輸,大 大的降低了網絡的傳輸效率,浪費Web資源.
// 有了緩存,就可以保留第一條服務器響應的副本.

帶寬瓶頸:

// 很多網絡為本地網絡客戶端提供的帶寬比遠程服務器提供的帶寬要寬.因此提供緩存可以提供交互的速度

緩存未命中:

// 一些到達緩存的請求可能會由于沒用副本可用,而被轉發給原始服務器,稱為緩存未命中.

再驗證:

// 原始服務器的內容可能會發生變化,緩存要不時對其進行檢測,看看它們保存的副本是否仍時服務器上最新的副本
// 這些"新鮮度檢測"被稱為HTTP再驗證

再驗證命中(緩慢命中):

// 緩存對緩存的副本進行再驗證時,會向原始服務器發送一個小的在驗證請求.如果內容沒有變化
// 服務器會以一個小的304 Not Modified進行響應.
// 只要緩存知道副本仍然有效,就會再次將副本標識為暫時新鮮的,并將副本提供給客戶端,這被稱作在驗證命中或緩慢命中

緩存命中率:

// 緩存提供服務的請求所占的比例稱為緩存命中率
// 對中等規模的Web緩存來說,40%的命中率是很合理的

字節命中率:

// 緩存提供的字節在傳輸的所有字節中所占的比例

私有緩存:

// 私有緩存不需要很大的存儲空間,這樣可以做得很小很便宜.
// Web瀏覽器中有內建的私有緩存---大多數瀏覽器都會將常用文檔緩存在個人電腦的磁盤和內存中,并且允許用戶區配置緩存的大小和各種設置

公有代理緩存:

// 公有緩存是特殊的共享代理服務器,被稱為緩存代理服務器(caching proxy server)或常見的代理緩存(proxy cache)
// 代理緩存會從本地緩存中提供文檔,或者代表用戶于服務器進行聯系

內容路由器:

// 有些網絡結構會構建復雜的網狀緩存,網狀緩存中的代理緩存之間會以更加復雜的方式進行對話,做出動態的緩存通信決策
// 決定與哪個父緩存進行對話,或者決定繞開緩存,直接連接原始服務器.這種代理緩存會決定選擇何種路由器對內容進行訪問、管理和傳送

文檔過期:

// HTTP有一些簡單的機制可以再不要求服務器記住有哪些緩存擁有其文檔副本的情況下,保持已緩存數據與服務器之間充分一致
// HTTP將之稱為文檔過期.// 文檔過期(Expires首部)
HTTP/1.0 200 OK
Date: Sat, 29 Jun 2002, 14:30:00 GMT
Content-type: text/plain
Content-legnth: 67
Expires: Fri, 05 Jul 2002, 05:00:00 GMTIndependence Day sale at Joe`s Hardware Come shop with us today!// Cache-Control: max-age 首部 (最大的生存時間,單位:秒)
HTTP/1.0 200 OK
Date: Sat, 29 Jun 2002, 14:30:00 GMT
Content-type: text/plain
Content-length: 67
Cache-Control: max-age=484200Independence Day sale at Joe`s Hardware Come shop with us today!

服務器再驗證:

// 僅僅是已緩存文檔過期了并不意味著它和原始服務器上目前處于活躍狀態的文檔有實際區別;只是意味著到了要進行核對的時間了.
// 這種情況稱為“服務器再驗證”// If-Modified-Since:Date再驗證
// 條件請求
GET /announce.html HTTP/1.0
If-Modified-Since: Sat, 29 Jun 2002, 14:30:00 GMT// 響應(成功的在驗證)
HTTP/1.0 304 Not Modified
Date: Wed, 03 Jul 2002, 19:18:23 GMT
Expires: Fri, 05 Jul 2002, 14:30:00 GMT// 響應(失敗的再驗證)
HTTP/1.0 200 OK
Date: Fri, 05 Jul 2002, 17:54:40 GMT
Content-length: 124
Expires: Mon, 09 Sep 2002, 05:00:00 GMTAll exterior house paint on sale through Labor Day.
Just Another reason for you to shop this summer at Joe`s Hardware!// If-None-Match:實體標簽再驗證(再某些情況下,僅使用最后修改日期再驗證是不夠的)
// 條件請求
GET /announce.html HTTP/1.0
If-None-Match: "v2.6"// 響應
HTTP/1.0 304 Not Modified
Date: Wed, 03 Jul 2002, 19:18:23 GMT
ETag: "v2.6"
Expires: Fri, 05 Jul 2002, 05:00:00 GMT// 強弱驗證器
// 有時服務器希望對文檔進行一些非實質性或不重要的修改時,不要使所有的已緩存副本都失效,
// HTTP/1.1支持"弱驗證器"
// 服務器會用"W/"來標識弱驗證器
ETag: W/"v2.6"
If-None-Match: W/"v2.6"

no-Store與no-Cache響應首部

Pragma: no-cache
Cache-Control: no-store
Cache-Control: no-cache
// no-store:禁止緩存對響應進行復制
// no-cache的響應在與原始服務器進行新鮮度再驗證之前,緩存不能將其提供給客戶端使用
// 以上2種對象是HTTP/1.1提供的,為了兼容于HTTP/1.0+,使用了Pragma: no-cache

max-age:

Cache-Control: max-age=3600
Cache-Control: s-maxage=3600
// max-age 此文檔處于新鮮狀態的秒數
// s-maxage 此文檔處于新鮮狀態的秒數,但僅適用于共享(公有)緩存// 服務器請求緩存不緩存該文檔:
Cache-Control: max-age=0
Cache-Control: s-maxage = 0

Expires:

Expires: Fri, 05 Jul 2002, 05:00:00 GMT
// 實際的過期日期
// 不推薦使用的原因:許多服務器的時鐘都不同步,或者不正確,所以最好用剩余秒數

must-revalidate:

Cache-Control: must-revalidate
// 原始服務器希望緩存嚴格遵守過期信息
// 該響應首部告訴緩存,在事先沒有跟原始服務器進行再驗證的情況下,不能提供對這個對象的陳舊副本

試探性過期

// 如果響應種沒有Cache-Control: max-age首部,也沒有Expires首部,緩存可以計算出一個試探性最大使用期
// 如果得到的最大試用期大于24小時,就應該向響應首部添加一個Heuristic Expiration WarningLM-Factor算法:
// 邏輯:
// 如果已緩存文檔最后一次修改發生在很久以前,它可能會是一份穩定的文檔,不太會突然發生變化 ,因此將其繼續保存在緩存中
// 如果已緩存文檔近期被修改過,就說明它很可能會頻繁發生變化,因此在與服務器進行再驗證之前,只應該將其緩存很短一段時間
// 下面是LM-factor算法的Perl偽代碼:
$time_since_modify = max(0, $server_Date - $server_Last_Modified);
$server_freshness_limit = int($time_since_modify * $lm_factor);

Apache關于緩存的HTTP首部

// mod_headers
// 將某目錄下的所有HTML文件都標識為非緩存
<Files * .html>Header set Cache-control no-cache
</Files>// mode_expires
// 將文檔的過期日期設置為對其最后一次被訪問之后或者其最近修改日期之后的某一時間
// 可以為不同的文件類型設置不同的過期日期
ExpiresDefault A3600
ExpiresDefault M86400
ExpiresDefault "access plus 1 week"
ExpiresByType text/html "modification plus 2 days 6 hours 12 minutes"

通過HTTP-EQUIV控制HTML緩存

// 讓coder無需與Web服務器的配置文件進行交互,能夠更容易地為所提供地HTML文檔分配HTTP首部信息
// HTML2.0 定義了 <META HTTP-EQUIV>標簽
<HTML><HEAD><TITLE>My Document</TITLE><META HTTP-EQUIV="Cache-control" CONNECT="no-cache"></HEAD>...
</HTML>

新鮮度算法(服務器)

sub server_freshness_limit
{local($heuristic, $server_freshness_limit,$time_since_last_modify);$heuristic = 0;if ($Max_Age_value_set) {$server_freshness_limit = $Max_Age_value;} else if ($Expires_value_set) {$server_freshness_limit = $Expires_value - $Date_value;} else if($Last_Modified_value_set) {$time_since_last_modify = max(0, $Date_value - $Last_Modified_value);$server_freshness_limit = int($time_since_last_modify * $lm_factor);$heuristic = 1;} else{$server_freshness_limit = $default_cache_min_lifetime;$heuristic = 1;}if($heuristic) {if($server_freshness_limit > $default_cache_max_lifetime) {$server_freshness_limit = $default_cache_max_lifetime;}if( $server_freshness_limit  < $default_cache_min_lifetime) {$server_freshness_limit = $default_cache_min_lifetime;}return ($server_freshness_limit);}
}

新鮮度算法(客戶端)

sub client_modified_freshness_limit
{$age_limit = server_freshness_limit();if($Max_Stale_value_set) {if( $Max_Stale_value == $INT_MAX){$age_limit = $INT_MAX;} else{$age_limit = server_freshness_limit() + $Max_Stale_value;}}if( $Min_Fresh_value_set) {$get_limit = min($age_limit, server_freshness_limit() - $Min_Fresh_value_set);}if($Max_Age_value_set) {$age_limit = min($age_limit, $Max_Age_value);}
}

參考 《HTTP權威指南》第7章

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251136.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251136.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django 下添加左側字段顯示和搜索

在對應的apps下建立xadmin.py from .models import EmailVerifyRecord import xadminclass EmailVerifyRecordAdmin(object): list_display [code,email,send_type,send_time]//字段顯示 search_fields [code,email,send_type]//搜索 xadmin.site.register(EmailVerify…

免費分享老男孩全棧9期視頻,共126天

免費分享老男孩全棧9期視頻&#xff0c;共126天。 及時保存避免失效&#xff1a;http://mihon.cn/article/26.html/ 轉載于:https://www.cnblogs.com/mihon/p/9372881.html

ES5 數組擴展方法 forEach/filter/map的使用與重寫

ES3 splice slice join sort &#xff08;IE5、IE6&#xff09; 數組擴展方法 ES5&#xff08;在ES3的基礎上增加、修正&#xff09; forEach 可能會改變原數組(直接操作了arr[i]&#xff0c;沒有使用深拷貝)參數1&#xff1a;回調函數&#xff08;如果不使用箭頭函數&#xf…

http --- 網關、隧道、中繼

網關: // 作為某種翻譯器使用,抽象出了一種能夠到達的資源 // 應用程序可以請求網關來處理某條請求. // 在HTTP和其他協議及其應用程序之間起到接口作用FTP URL的HTTP請求: GET ftp://ftp.irs.gov/pub/00-index.txt HTTP/1.0 Host: ftp.irs.gov User-agent: SuperBrowser 4.2…

狀態碼

服務器向用戶返回的狀態碼和提示信息&#xff0c;常見的有以下一些&#xff08;方括號中是該狀態碼對應的HTTP動詞&#xff09; 200 OK - [GET]&#xff1a;服務器成功返回用戶請求的數據&#xff0c;該操作是冪等的&#xff08;Idempotent&#xff09;。 201 CREATED - [POST/…

187. Repeated DNA Sequences重復的DNA子串序列

&#xff3b;抄題&#xff3d;&#xff1a; All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a fun…

http --- cookie與會話跟蹤

以購物網站Amazon.com為例 // (a)客戶端:首次請求Amazon.com根頁面 GET / HTTP/1.0 Host: www.amazon.com// (b)服務器:將客戶端重定向到一個電子商務軟件的URL上 HTTP/1.1 302 Found Location: http://www.amazon.com:80/exec/obidos/subst/home/redirect.html// (c)客戶端:對…

ES5 every/some/reduce/reduceRight的使用與重寫

被作為實參傳入另一函數&#xff0c;并在該外部函數內被調用&#xff0c;用以來完成某些任務的函數&#xff0c;稱為回調函數。 break、return用于終止循環的區別&#xff1a; return只能用在函數體內&#xff08;單獨一個for循環里直接用return會報錯&#xff09;對于多層循環…

同步異步單線程多線程初級理解

對于我開始接觸同步異步單線程多線程的概念的時候&#xff0c;都是分別理解同步和異步、單線程和多線程概念&#xff0c;當看到“使用同步方法保證線程安全”時愚昧的理解為那就是單線程咯&#xff1b;于是就陷入了困惑&#xff0c;同步等于單線程嗎&#xff1f;下面是我自己不…

http --- 基本認證與摘要認證

基本認證: // (a)客戶端:查詢 GET /cgi-bin/checkout?cart17854 HTTP/1.1// (b)服務器:質詢 HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm"Shopping Cart"// (c)客戶端:響應 GET /cgi-bin/checkout?cart17854 HTTP/1.1 Authorization: Basic YnJpYW4…

對棧

1331【例1-2】后綴表達式的值 #include<bits/stdc.h>using namespace std;int sta[101];char s[256]; int comp(char s[256]){ int i0,top0,x; while(i<strlen(s)-2) { switch(s[i]) { case:sta[--top]sta[top1];break; case-:sta[--top]-sta[top1];break; case*:sta[…

hive中map相關函數總結

目錄 hive官方函數解釋示例實戰 hive官方函數解釋 hive官網函數大全地址&#xff1a; hive官網函數大全地址 Return TypeNameDescriptionmapmap(key1, value1, key2, value2, …)Creates a map with the given key/value pairs.arraymap_values(Map<K.V>)Returns an un…

【前端統計圖】echarts改變顏色屬性的demo

一&#xff1a;柱狀圖改變顏色 圖片.png代碼&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!-- 柱狀統計圖 --><div class"row"><div …

DOM-1 DOM初探、JS對象、XML、幻燈片案例展示

DOM DOM —— Document Object Model(文檔對象模型)DOM 對象 → 宿主對象&#xff08;是瀏覽器提供的&#xff09;通過瀏覽器提供的方法表示或操作HTML和XML不能操作css標簽&#xff1a;<></>對元素&#xff1a;<>及內部的內容,getElementsByTagName獲取的是…

http --- 密碼、密鑰、對稱(公開)密鑰加密系統、數字簽名、數字證書的一些概念

密碼(cipher) // 密碼是一套編碼方案和使用相應解碼方式的結合體 // *明文:使用密碼加密之前的稱為明文 // *密文:使用密碼進行加密的稱為密文最初的密碼是相當簡單的,很容易就可以破解,于是產生了密碼機: // 密碼機可以用復雜得多得密碼來快速、精確地對報文進行編碼.它們可…

elasticsearch5.x:查詢建議介紹、Suggester 介紹以及Java-api實現

elasticsearch5.x&#xff1a;查詢建議介紹、Suggester 介紹 參考&#xff1a;http://www.cnblogs.com/leeSmall/p/9206646.html 參考(重點)&#xff1a;https://elasticsearch.cn/article/142 參考&#xff08;官網&#xff09;&#xff1a;https://www.elastic.co/guide/en/e…

DOM-2 document對象、獲取元素、節點、遍歷樹

一、document獲取元素 1. 方法 document.getElementById(‘box’) // 在IE8及以下是不分大小寫的&#xff0c;而且name值也能匹配上document.getElementsByClassName(’’) // IE8及以下是用不了的document.getElementsByTagName() 都兼容document.getElementsByName() 用的非…

javascript --- js中的事件

事件實現松耦合: // JS和HTML之間的交互是通過事件實現的. // 事件,就是文檔或瀏覽器窗口中發生一些特定的交互瞬間. // 可以使用偵聽器來預定事件,以便事件發生時執行相應的代碼. // 這種在傳統軟件工程中被稱為觀察員模式的模型,支持頁面的行為與頁面的外觀之間的松耦合事件…

centos系統設置局域網靜態IP

---恢復內容開始--- centos系統設置局域網靜態IP 很多時候&#xff0c;我們并不希望漏油器重啟之后&#xff0c;自己的服務器動態的獲取IP&#xff0c;這樣很不利&#xff0c;因為你可能裝了mysql&#xff0c;redis&#xff0c;等軟件&#xff0c;然后需要遠程去訪問這臺服務器…

SQLServer數據庫(二)

數據庫設計&#xff1a;就是將數據庫中的數據庫實體及這些數據庫實體之間的關系&#xff0c;進行規劃和結構化的過程。 項目開發過程&#xff1a; 需求分析 概要設計 詳細設計 代碼編寫 運行測試 打包發行 數據庫的系統分析基本步驟&#xff1a;收集信息、標識實體、標識每個實…