Ⅰ 瀏覽器緩存機制
有dns的地方,就有緩存。瀏覽器、操作系統、Local DNS、根域名伺服器,它們都會對DNS結果做一定程度的緩存。
DNS查詢過程如下:
首先搜索瀏覽器自身的DNS緩存,如果存在,則域名解析到此完成。
如果瀏覽器自身的緩存裡面沒有找到對應的條目,那麼會嘗試讀取操作系統的hosts文件看是否存在對應的映射關系,如果存在,則域名解析到此完成。
如果本地hosts文件不存在映射關系,則查找本地DNS伺服器(ISP伺服器,或者自己手動設置的DNS伺服器),如果存在,域名到此解析完成。
如果本地DNS伺服器還沒找到的話,它就會向根伺服器發出請求,進行遞歸查詢。
瀏覽器本地緩存失效後,瀏覽器會向CDN邊緣節點發起請求。類似瀏覽器緩存,CDN邊緣節點也存在著一套緩存機制。CDN邊緣節點緩存策略因服務商不同而不同,但一般都會遵循http標准協議,通過http響應頭中的
Cache-control: max-age 的欄位來設置CDN邊緣節點數據緩存時間。
當瀏覽器向CDN節點請求數據時,CDN節點會判斷緩存數據是否過期,若緩存數據並沒有過期,則直接將緩存數據返回給客戶端;否則,CDN節點就會向伺服器發出回源請求,從伺服器拉取最新數據,更新本地緩存,並將最新數據返回給客戶端。 CDN服務商一般會提供基於文件後綴、目錄多個維度來指定CDN緩存時間,為用戶提供更精細化的緩存管理。
CDN 優勢
CDN節點解決了跨運營商和跨地域訪問的問題,訪問延時大大降低。
大部分請求在CDN邊緣節點完成,CDN起到了分流作用,減輕了源伺服器的負載。
http請求報文(request)
請求行
請求方法 空格 URL 空格 協議版本 回車符 換行符
請求頭(通用信息頭、請求頭、實體頭)
頭部欄位名 冒號 值 回車鍵 換行符
...
頭部欄位名 冒號 值 回車鍵 換行符
空行
回車符 換行符
實體主體(只有post請求有)
主體
http響應報文(response)
狀態行
協議版本 空格 狀態碼 空格 狀態碼描述 回車符 換行符
響應頭部
頭部欄位名 冒號 值 回車符 換行符
...
頭部欄位名 冒號 值 回車符 換行符
空行
回車符 換行符
響應正文
正文
瀏覽器初次向伺服器發起請求後拿到請求結果,會根據響應報文中HTTP頭的緩存標識,決定是否緩存返回的結果,是則將請求結果和緩存標識存入瀏覽器緩存中
瀏覽器每次發起請求,都會現在瀏覽器緩存中查找該請求的結果以及緩存標識
瀏覽器 瀏覽器緩存 伺服器
——————第一次發起http請求——————>
<——沒有該請求的緩存結果和緩存標識————
——————————————發起http請求——————————————>
<——————————返回該請求結果和緩存規則————————————
——將請求結果和緩存標識存入瀏覽器緩存——>
強制緩存就是向瀏覽器緩存查找結果,並根據該結果的緩存規則來決定是否使用該緩存結果的過程
強制緩存的情況分為三種:
1、不存在該緩存結果和緩存標識,強制緩存失效,直接向伺服器發起請求
2、存在該緩存結果和緩存標識,但結果已經失效,強制緩存失效,使用協商緩存
3、存在該緩存結果和緩存標識,且該結果沒有失效,強制緩存生效,直接返回該結果
控制強制緩存的欄位:Expires,Cache-Control
Expires 是 HTTP/1.0 控制緩存的欄位,值為伺服器返回該請求的結果緩存時間
即再次發送請求是,客戶端時間 小於 Expires的值,直接使用緩存結果
Cache-Control 是HTTP/1.1的規則,主要用於控制網頁緩存,主要取值為:
public:所有的內容都緩存(客戶端和代理伺服器都可以緩存)
private:所有內容只有客戶端可以緩存(默認值)
no-cache:客戶端緩存內容,但是是否使用緩存則需要經過協商緩存來驗證決定
no-store:即不使用強制緩存,也不使用協商緩存
max-age=xxx:緩存內容將在xxx秒後失效
Expires 是一個絕對值
Cache-Control 中 max-age 是相對值,解決了 Expires時期 服務端與客戶端 可能出現時間差的問題
註:Expires和Cache-Control同時存在時,只有Cache-Control生效
協商緩存就是強制緩存失效後,瀏覽器攜帶緩存標識向伺服器發起請求,由伺服器根據緩存標識決定是否使用緩存的過程
協商緩存的兩種情況:
1、協商緩存生效,返回304,繼續使用緩存
過程:
瀏覽器 瀏覽器緩存 伺服器
————————發起http請求————————>
<——該請求的緩存結果失效,只返回緩存標識——
————————攜帶該資源的緩存標識,發起http請求————————>
<—————————————304,該資源無更新————————————
——————獲取該請求的緩存結果——————>
<——————返回該請求的緩存結果——————
2、協商緩存失敗,返回200和請求結果
過程:
瀏覽器 瀏覽器緩存 伺服器
————————發起http請求————————>
<——該請求的緩存結果失效,只返回緩存標識——
————————攜帶該資源的緩存標識,發起http請求————————>
<————————200,資源已更新,重新返回請求和結果———————
——將該請求結果和緩存標識存入瀏覽器緩存中—>
協商緩存的標識也是在響應報文的HTTP頭中和請求結果一起返回給瀏覽器的
控制協商緩存的欄位:
(1) Last-Modified/If-Modified-Since:Last-Modified是伺服器響應請求是,返回該資源文件在伺服器最後被修改的時間;If-Modified-Since再次發起請求時,攜帶上次返回的Last-Modified的值,伺服器將該欄位值與該資源最後修改時間對比,決定是否用緩存
(2)Etag/If-None-Match:Etag伺服器響應請求時,返回當前資源文件的一個唯一標識,由伺服器生成之;If-None-Match是再次發起請求時,攜帶上次返回的唯一標識Etag的值,伺服器收到後,將該欄位值與該資源在伺服器上的Etag對比,一致 則返回304,否則返回200
註:Etag/If-None-Match優先順序高於Last-Modified/If-Modified-Since,同時存在時只有Etag/If-None-Match生效
瀏覽器緩存分為:內存緩存 和 硬碟緩存
內存緩存特性:
(1)快速讀取:內存緩存會將編譯解析後的文件,存入該進程的內存中,便於下次運行時快速讀取
(2)時效性:一旦關閉進程,進程內存清空
硬碟緩存特性:
永久性:直接寫入硬碟文件中
復雜、緩慢:讀取緩存對該緩存存放的硬碟文件進行I/O操作,重新解析
from memory cache:使用內存中的緩存
from disk cache:使用硬碟中的緩存
瀏覽器讀取順序:memory ——> disk
瀏覽器將js和圖片等文件解析執行後直接存入內存緩存中,F5刷新頁面時,from memory cache(使用內存中的緩存)
css文件存入硬碟中,F5刷新頁面時,from disk cache(使用硬碟中的緩存)
參考文章
https://segmentfault.com/a/1190000017962411
https://www.cnblogs.com/chengxs/p/10396066.html
Ⅱ HTTP緩存機制 渡一教育
我們經常說這個頁面有緩存~!這個Css有緩存~!我們如果打開控制台,也經常看到有個叫做Cache-Control的欄位,但是這個欄位里有很多種類的值,有很多同學不明白這些值都是什麼意思~
這些值不但在實際中會經常用到,而且在面試中也會經常被提起,那麼今天我們就來一起看一下這些值的含義吧~
其實cache-control里的欄位分為兩類,一類是RequestHeader中使用的,另一類是ResponseHeader中使用的,我們最常見的或者說和前端最相關的就是ResponseHeader中使用的cache-control。
我們今天來用鄧哥吃葯的例子,來為大家解釋ResponseHeader中的Cache-Control的各種值~
鄧哥的近況可以用一句話來形容,那就是「浪多人變傻」。有一天鄧哥忽然發現自己的腦子不夠用了。於是決定買點葯,不能讓這種情況進一步惡化下去~
於是鄧哥去了葯店,葯店的醫生見了鄧哥,頓時大喜道:「呀~!鄧哥來啦~!今天想吃點啥?」鄧哥向葯店醫生描述了自己的情況之後,葯店的醫生推薦給鄧哥本店的招牌【腦殘片】。我們的故事就是從這開始的~
這時我們可以把鄧哥比作瀏覽器,葯店比作伺服器,葯店醫生比作伺服器的代理,腦殘片就是要請求的資源,比如一個圖片之類的~
1.max-age:
鄧哥有個怪癖,買回來超過七天就不吃了,就得買新的。(就算沒過期也不吃了~如果過期那更不吃了~)
這就是max-age的作用,緩存的資源,超過一定時間就不要了,就要重新請求。如果買回來的時間是1號,腦殘片的過期時間是5號,雖然鄧哥能接受葯在自己家放7天,但是因為5號就過期了,所以鄧哥5號之後還是要重新去買的。max-age後面通常跟著一串數字,表示緩存的秒數。
2.max-stale:
有時鄧哥也是很節儉的,有的東西過期幾天也是會吃的。
這就是max-stale的作用,過期一點時間無所謂,也能用。max-stale後面也跟著秒數,表示過期多長時間的東西也可以繼續使用。
max-stale多數的時候會跟著max-age一起使用。如果腦殘片是1號買的,鄧哥最多保留7天(到7號),但是腦殘片5號過期,如果max-stale=4的話,就意味著鄧哥可以接受過期4天之內的腦殘片。
也就是相當於鄧哥認為腦殘片9號之後才不能吃。但是鄧哥最多隻能容忍葯放在家裡7天,所以8號的時候鄧哥會去重新買葯(重新請求資源)。
3.no-cache
鄧哥有時候謹慎起來也是很抽風的,每次吃葯之前都要先去葯店,讓醫生看一下葯還能不能吃。萬一哪批葯有問題被召回了呢~(Ps:你懂的)
這就是no-cache的作用,no-cache不會直接使用緩存,而是每次使用資源之前,都要先向伺服器詢問一下這個資源還能不能用,如果能用就繼續用,如果不能用就重新請求。
4.no-store
有時候鄧哥也是很土豪的,每次吃葯都要新買一瓶。每次都吃新的。(最早的時候,鄧哥的手機也是,每次沒電都買個新的,後來才知道手機居然可以充電。。。)
這就是很no-store,很土豪的做法,每次都要向伺服器請求資源。如果所有的資源都這樣會對伺服器造成很大的壓力,所以我們對於那種對數據時效很敏感的數據,才會做這樣的操作。
5.public
鄧哥家裡有好多腦殘片,由於鄧哥經常去買腦殘片,所以一進葯店醫生就會開玩笑道:「又來買腦殘片啦?」
public表示緩存可以被任何地方緩存,葯店是伺服器,醫生相當於是代理伺服器,葯店的醫生都能知道鄧哥要買腦殘片,證明代理伺服器已經緩存了鄧哥要買的東西。所以public表示任何地方都可以緩存資源。
6.private
有的醫生也是很嚴肅的,不會每次都和鄧哥開玩笑。所以有的時候鄧哥去葯店,醫生會很有禮貌並面帶微笑的問鄧哥:「今天想買什麼~?」
private的意思就是只指允許客戶端進行緩存,代理伺服器不能緩存這個資源。
7.must-revalidation
有的時候,鄧哥比較忙,鄧嫂也會給鄧哥備著點葯。當鄧嫂手裡的葯過期的時候,鄧嫂也會去葯店買葯。
鄧哥和鄧嫂相當於同一個瀏覽器中的兩個窗口。max-age和must-revalidation都是本地過期之後去伺服器端重新請求資源。但是區別在於,如果用max-age,那麼如果資源沒過期,新開的窗口也會使用這個資源。如果是must-revalidation,每次新打開窗口,都會向伺服器去請求資源。
8.no-transform
鄧哥的腦殘片是進口的,標簽上都是英文,有時葯店醫生擔心病人不認識葯瓶上的字,會把字翻譯過來寫在標簽上,然後貼上去。但是如果生產廠家要求,不能在中途對資源做任何修改操作,葯店醫生就不會給葯瓶貼標簽了~。
通常當傳輸圖片或者資源時,有時代理伺服器為了有更好的性能,會對圖片或者資源進行壓縮,或者格式的轉換。但是如果在響應頭中帶有這個欄位,就表示這不允許在傳輸的中途對資源做任何修改。
除了以上這些參數的作用會被經常問到之外,還會經常問到瀏覽器對於這些參數的相關響應,不同的參數加上不同的操作會產生不同的動作。我們可以通過下面的表格看到具體會發生什麼動作。
以上故事內容純屬虛構,感謝鄧哥對《鄧哥奇遇記》系列的大力支持。最後對鄧哥補充一句:「葯不能停~!」
Ⅲ nginx 緩存機制
Nginx緩存的基本思路
基本思想是利用客戶訪問的時間局部性原理,對客戶已經訪問過的內容在Nginx伺服器本地建立副本,這樣在一段時間內再次訪問該數據,就不需要通過Nginx伺服器再次向後端伺服器發出請求,所以能夠減少Nginx伺服器與後端伺服器之間的網路流量,減輕網路擁塞,同時還能減小數據傳輸延遲,提高用戶訪問速度。同時,當後端伺服器宕機時,Nginx伺服器上的副本資源還能夠回應相關的用戶請求,這樣能夠提高後端伺服器的魯棒性。
對於緩存,我們大概會有以下問題:
(1)緩存文件放在哪兒?
(2)緩存的空間大小是否可以限定?
(3)如何指定哪些請求被緩存?
(4)緩存的有效期是多久?
(5)對於某些請求,是否可以不走緩存?
解決這些問題後,nginx的緩存也就基本配置完成了,下面看詳細配置過程
開啟緩存
要使用緩存,首先要使用 proxy_cache_path 這個指令(必須放在 http 上下文的頂層位置),然後在目標上下文中使用 proxy_cache 指令
配置示例
proxy_cache_path 有兩個必填參數,第一個參數為 緩存目錄,第二個參數keys_zone指定緩存名稱和佔用內存空間的大小(註:示例中的10m是對內存中緩存內容元數據信息大小的限制,如果想限制緩存總量大小,需要用 max_size 參數)
proxy_cache 的參數為之前指定的緩存名稱
緩存管理的相關進程
在緩存工作中有兩個附加進程:
(1)緩存管理器
定期檢查緩存狀態,看緩存總量是否超出限制,如果超出,就移除其中最少使用的部分
(2)緩存載入器
載入器只在nginx啟動後運行一次,把緩存內容的元數據信息載入到內存空間,如果一次性載入全部緩存信息,會大量消耗資源,使nginx在啟動後的幾分鍾里變慢,為避免此問題,有3種載入策略:
loader_threshold – 指定每次載入執行的時間
loader_files – 每次最多載入的數量
loader_sleeps – 每次載入的延時
例如:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
指定緩存哪些請求
nginx默認會緩存所有 get 和 head 方法的請求結果,緩存的key默認使用請求字元串
(1)自定義key
例如 proxy_cache_key " request_uri cookie_nocache arg_comment;
如果任何一個參數值不為空,或者不等於0,nginx就不會查找緩存,直接進行代理轉發
綜合示例
nginx 緩存機制
三分鍾看懂Nginx伺服器的緩存原理和機制
Ⅳ 北大青鳥java培訓:web伺服器緩存基本定義
為了能夠給用戶一個良好的上網體驗,大部分的網頁和瀏覽器都配置了預載入以及緩存功能。
今天甘肅電腦培訓http://www.kmbdqn.cn/就通過案例分析來了解一下,關於web緩存的基本定義與類型介紹。
Web緩存是什麼?為什麼要使用緩存?Web緩存處於伺服器(也稱為源伺服器)和客戶端之間,監視請求並保存響應的副本,比如HTML頁面,圖片和文件等(統稱為表述)。
如果之後有對同一個URL的新請求,它會使用自己保存的內容來響應,而不是再次請求源伺服器來獲取內容。
使用Web緩存主要有下面兩個原因:減少延遲——因為響應請求的內容來自緩存(距客戶端較近)而不是源伺服器,它會花較少的時間來獲得表述並將他們呈現出來。
這使得Web看起來具有良好的響應速度。
減少網路傳輸——由於復用了表述,它可以減少客戶端使用的帶寬總量。
如果客戶需要為流量付費,這就意味著省錢。
緩存會降低對帶寬的要求,也降低處理難度。
Web緩存的種類瀏覽器緩存你在查看現代Web瀏覽器(比如IE、Safari或Mazilla)選項的時候,可能會看到「緩存」設置。
這個選項讓你配置一部分硬碟空間來保存你看過的表述。
瀏覽器緩存的規則相當簡單。
它通常會在一次會話(即當前瀏覽器中一次調用)中檢查表述是否新。
這個緩存在用戶使用「回退」按鈕或者點擊一個瀏覽過的鏈接時會特別有用。
而且,如果你在網站緩悔數的各個頁面中瀏覽相同的圖片,他們幾乎能馬上從緩存中載入出來。
代理緩存Web代理緩存的工作原理相同,但規模更大。
代理以同樣的方式為成百上千的用戶服務;大公司和ISP常常把代碼緩存建立在防火牆之上,也可能是以獨立設備的形式存在(也稱為中間設備)。
代理緩存即不是客戶端的一部分,也不是伺服器的一部分,而是在網路之外,必須以某種方式把請求路由過去。
其中一種方式是手工修改瀏覽器代理設備,指定要使用的代碼;另一種方式是攔截。
攔截式代理會根據其自身的基礎網路重定向Web請求,不需要前襪在客戶端配置,客戶端甚至不知道它們的存在。
代理緩存是一種共享緩存,通常不只是一個用戶,而是大量用擾首戶在使用代理緩存。
正因為如此,他們特別擅長降低延遲和網路傳輸量。
這是因為眾人都需要的表述會被多次重復使用。
網關緩存網關緩存又名「反向代理緩存」或「替代緩存」。
網關緩存也是一種中介,它他們不是由網路管理員部署以節約帶寬,而是由網站管理員自己部署,使其站點更具伸縮性、可靠性以及擁有更好的性能。
很多方法都可以把請求路由到網關緩存,但常見的方法是使用負載均衡器讓他們對於客戶來說,看起來就跟源伺服器一樣。
內容分發網路(CDN)在整個Internet(或它的一部分)中分發網關緩存,並將其出售給對此感興趣的網站。
Web緩存對我有壞處么?我為什麼要幫助它們?Web緩存是互聯網中誤解深的技術之一。
因為代理緩存可以隱藏使用網站的用戶,所以網站管理員特別害怕失去對他們的站點的控制,這會使得他們很難去知道是誰在使用他們的站點。
然而不幸的是,即使沒有Web緩存,網路上也有非常多的因素可以保證管理員精確的知道一個用戶如何使用他們的站點。
如果這是你非常關注的問題的話,這篇手冊將會指導你如何在站點沒有不友好的緩存機制的情況下獲取你需要的統計信息。
Ⅳ WebCache web的緩存機制
1.webcache的簡單介紹
web緩存,是一種 緩存技術 ,用於臨時存儲(緩存)的網頁文件,如HTML頁面和圖像等靜態資源,減少帶寬以及後端伺服器的壓力,通常一個WebCache也是一個 反向代理軟體 ,既可以通過緩存響應用戶的請求,當本地沒有緩存時,可以代理用戶請求至後端主機。
WebCache分為正向和反向之分,一般正向WebCache不常用,這次主要以反向WebCache為主。
2.webcache的由來
1)由於程序具有局部性,而局部性分為: 時間局部性和空間局部性
A.時間局部性是指:在單位時間內,大部分用戶訪問的數據只是熱點數據(熱點數據指經常被訪問的數據)
B.空間局部性是指:某新聞網站突然出來一個重大新聞,此新聞會被被反復訪問。
3.webcache的變化性
WebCache的新鮮度監測機制 :數據都是可變的,所以緩存中的內容要做新鮮度檢測.
4.緩存相關的HTTP首部:
HTTP協議提供了多個首部用以實現 頁面緩存及緩存失效 的相關功能,這其中最常用的有:
1)Expires:HTTP/1.0,用於指定某web對象的過期日期/時間,通常為GMT格式;一般不應該將此設定過長的時間,一年的長度對大多場景來說足矣;其常用於為 純靜態內容 如JavaScripts樣式表或圖片指定緩存周期;
(2)Cache-Control:為了解決HTTP/1.0中對於新鮮度控制的策略而生,通過相對時間來控制緩存使用期限;
(3)Etag:響應首部,用於在 響應報文中為某web資源定義版本標識符 ;
(4)Last-Mofified:響應首部,用於回應客戶端關於Last-Modified-Since或If-None-Match首部的請求,以通知客戶端其請求的web對象最近的修改時間;
(5)If-Modified-Since:條件式請求首部,基於 請求內容的時間戳作驗正 ,如果後端伺服器數據的時間戳未發生改變則繼續使用,反之亦然.
(6)If-None-Match:條件式請求首部; 通過Etag來跟後端伺服器進行匹配 ,如果數據的Etag未發生改變,既不匹配,則響應新數據,否則繼續使用當前數據.
(7)Vary:響應首部,原始伺服器根據請求來源的不同響應的可能會有所不同的首部,最常用的是 Vary: Accept-Encoding,用於通知緩存機制其內容看起來可能不同於用戶請求時 Accept-Encoding-header首部標識的編碼格式;
(8)Age:緩存伺服器可以發送的一個額外的響應首部,用於指定響應的有效期限;瀏覽器通常根據此 首部決定內容的緩存時長;如果響應報文首部還使用了max-age指令,那麼緩存的有效時長為 「max-age減去Age」的結果;
Ⅵ 談一談NSCache
NSCache介紹
NSCache是蘋果提供的一套緩存機制,與NSMutableDictionary可變字典的用法類似,常見於一些第三方庫,比如AFNetworking,SDWebImage。
使用場景:通常用使用緩存來臨時存儲短時間使用但創建昂貴的對象,優化性能,避免這些對象的多次創建 。
NSCache和NSMutableDictionary的區別
1、NSCache是線程安全的,不需要加線程鎖,而NSMutableDictionary線程不安全,多線程訪問和操作,需要我們自己設置管理。
2、NSCache的內存由系統管理,當內存不足時,NSCache會自動釋放內存。
3、NSCache可以設置緩存對象數量和佔用的內存大小,當緩存超出了設置,會自動釋放內存。
4、NSCache是Key-Value的數據結構,其中key是強引用,不實現NSCoping協議,作為key的對象不會被拷貝。
下面介紹NSCache的屬性、方法、代理
屬性
countLimit: 能夠緩存對象的最大數量,默認值是0,沒有限制(限制是不精/不嚴格的)。 totalCostLimit: 設置緩存佔用的內存大小(限制是不精/不嚴格的)。
: 是否回收廢棄內容,默認YES。
方法
setObject: forKey: 緩存對象。
setObject: forKey: cost: 緩存對象,並指定key值對應的成本,用於計算緩存中所有對象的總成本。
objectForKey: 通過key獲得緩存對象。
removeObjectForKey: 刪除指定對象removeAllObjects: 刪除所有緩存對象
代理(NSCacheDelegate)
willEvictObject: 緩存對象即將被清理時調用,一般開發者用來調試,不能在此方法中修改緩存
以下場景會被調用:
1、 removeObjectForKey
2、緩存對象超過NSCache的countLimit和otalCostLimit屬性設置的限制
3、App進入後台
4、系統發出內存警告
5、cache這個實例的生命周期結束前
NSCache注意點
1、當收到內存警告,而我們又調用removeAllObjects,則無法再繼續往緩存中添加數據。
-(void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
// 當收到內存警告,在這里清除緩存
[self.cache removeAllObjects];
// 如果再繼續添加數據的話 會直接被刪除
}
2、不提供緩存總的大小,想知道NSCache佔用的內存大小,只有通過添加緩存的cost自己計算。
3、NSCache自動釋放內存的演算法是不確定的, 有時是按照LRU(最近最久未使用)釋放,有時隨機釋放。
4、NSCache中的數據在APP重啟後會消失,因為NSCache只是將數據保存在內存。
Ⅶ 【NGINX入門】3.Nginx的緩存伺服器proxy_cache配置
本文介紹NGINX緩存機制,配置和參數說明。
如圖所示,nginx緩存,可以在一定程度上,減少源伺服器的處理請求壓力。因為靜態文件(比如css,js, 圖片)中,很多都是不經常更新的。nginx使用proxy_cache將用戶的請求緩存到本地一個目錄。下一個相同請求可以直接調取緩存文件,就不用去請求伺服器了。畢竟,IO密集型服務的處理是nginx的強項。
Nginx的緩存加速功能是由proxy_cache(用於反向代理和靜態緩存)和fastcgi_cache(PHP動態緩存)兩個功能模塊完成。
Nginx緩存特點:
先上個例子:
因為我是在一台伺服器上做試驗,所以用了兩個埠 80 和 90 進行模擬兩台伺服器之間的交互。
接下來講一下配置項:
這里我設置了 圖片 、 css 、 js 靜態資源進行緩存。
當用戶輸入 http://wangxiaokai.vip 域名時,解析得到 ip:port 的訪問地址。 port 默認為80。所以頁面請求會被當前server截取到,進行請求處理。
當解析到上述文件名結尾的靜態資源,會到緩存區獲取靜態資源。
如果獲取到對應資源,則直接返回數據。
如果獲取不到,則將請求轉發給 proxy_pass 指向的地址進行處理。
這里直接處理 90 埠接受到的請求,到伺服器本地目錄 /mnt/blog 下抓取資源進行響應。
細心的讀者應該發現,我在第二段例子里,留了個彩蛋 add_header wall "hey!guys!give me a star." 。
add_header 是用於在報頭設置自定義的信息。
所以,如果緩存有效的話,那麼靜態資源返回的報頭,一定會帶上這個信息。
(1)Nginx系列教程(3)nginx緩存伺服器上的靜態文件
https://yq.aliyun.com/articles/752967
(2)proxy_cache
nginx 反向代理之 proxy_cache https://www.cnblogs.com/yyxianren/p/10832172.html
(3)Nginx使用upstream負載均衡和proxy_cache緩存實現反向代理
https://blog.51cto.com/13770206/2163952
Ⅷ web前端緩存機制
前端緩存機制有多種,如瀏覽器緩存、CDN緩存、DNS緩存、代理伺服器緩存等。
CDN全稱是Content Delivery Network,即內容分發網路。CDN的原理是將資源存放在各地的緩存伺服器上,當用戶請求資源時,從就近的伺服器上返回緩存的資源,而不需要每次都從源伺服器獲取,減輕源伺服器的壓力,又能提升用戶的訪問速度。
瀏覽器可以將用戶請求的資源進行緩存,存放在本地。瀏覽器緩存一般通過請求頭來設置。
與瀏覽器緩存有關的頭部有:
瀏覽器會將伺服器的域名與IP地址的映射緩存在本地,這樣用戶在訪問網站時,不用每次都去查詢DNS映射表。
在瀏覽器和伺服器之間架設的一個伺服器 ,這個代理伺服器會幫助瀏覽器去請求頁面,然後將頁面進行處理和壓縮(例如壓縮圖片和文件),使頁面變小,再傳輸給瀏覽器。大部分代理伺服器都有緩存的功能,如果瀏覽器所請求的文件在它本機中存在且是最新的,就不需要再從源伺服器請求數據,提高了瀏覽速度。
在瀏覽某個頁面時,瀏覽器會判斷頁面的關聯內容,進行預載入。用戶在瀏覽A頁面時,就載入好B頁面,這樣當用戶去訪問B頁面時,B頁面很快就出來,提升了用戶體驗。但這個機制有一定的缺陷,就是預判不一定準確,可能會造成流量和資源的浪費。
Ⅸ php的緩存機制有哪些
主要有:
①普遍緩存技術②頁面緩存③時間觸發緩存④內容觸發緩存⑤靜態緩存(就生成html文件)
⑥內存緩存⑦php的緩沖器⑧MYSQL緩存⑨基於反向代理的Web緩存,DNS輪詢
但是一般常用的就 ①②④,其他的是網站數據量大,交互多,為減小伺服器壓力才用到
參考資料:http://blog.163.com/yuzhongfeiyan338@126/blog/static/38688323200981604944905/
Ⅹ 協商緩存和強緩存的區別
協商緩存和強緩存的區別
(1)強緩存
使用強緩存策略時,如果緩存資源有效,則直接使用緩存資源,不必再向伺服器發起請求。
強緩存策略可以通過兩種方式來設置,分別是 http 頭信息中的 Expires 屬性和 Cache-Control 屬性。
(1)伺服器通過在響應頭中添加 Expires 屬性,來指定資源的過期時間。在過期時間以內,該資源可以被緩存使用,不必再向伺服器發送請求。這個時間是一個絕對時間,它是伺服器的時間,因此可能存在這樣的問題,就是客戶端的時間和伺服器端的時間不一致,或者用戶可以對客戶端時間進行修改的情況,這樣就可能會影響緩存命中的結果。
(2)Expires 是 http1.0 中的方式,因為它的一些缺點,在 HTTP 1.1 中提出了一個新的頭部屬性就是 Cache-Control 屬性,它提供了對資源的緩存的更精確的控制。它有很多不同的值,
Cache-Control可設置的欄位:
public:設置了該欄位值的資源表示可以被任何對象(包括:發送請求的客戶端、代理伺服器等等)緩存。這個欄位值不常用,一般還是使用max-age=來精確控制;
private:設置了該欄位值的資源只能被用戶瀏覽器緩存,不允許任何代理伺服器緩存。在實際開發當中,對於一些含有用戶信息的HTML,通常都要設置這個欄位值,避免代理伺服器(CDN)緩存;
no-cache:設置了該欄位需要先和服務端確認返回的資源是否發生了變化,如果資源未發生變化,則直接使用緩存好的資源;
no-store:設置了該欄位表示禁止任何緩存,每次都會向服務端發起新的請求,拉取最新的資源;
max-age=:設置緩存的最大有效期,單位為秒;
s-maxage=:優先順序高於max-age=,僅適用於共享緩存(CDN),優先順序高於max-age或者Expires頭;
max-stale[=]:設置了該欄位表明客戶端願意接收已經過期的資源,但是不能超過給定的時間限制。
一般來說只需要設置其中一種方式就可以實現強緩存策略,當兩種方式一起使用時,Cache-Control 的優先順序要高於 Expires。
no-cache和no-store很容易混淆:
no-cache 是指先要和伺服器確認是否有資源更新,在進行判斷。也就是說沒有強緩存,但是會有協商緩存;
no-store 是指不使用任何緩存,每次請求都直接從伺服器獲取資源。
(2)協商緩存
如果命中強制緩存,我們無需發起新的請求,直接使用緩存內容,如果沒有命中強制緩存,如果設置了協商緩存,這個時候協商緩存就會發揮作用了。
上面已經說到了,命中協商緩存的條件有兩個:
max-age=xxx 過期了
值為no-store
使用協商緩存策略時,會先向伺服器發送一個請求,如果資源沒有發生修改,則返回一個 304 狀態,讓瀏覽器使用本地的緩存副本。如果資源發生了修改,則返回修改後的資源。
協商緩存也可以通過兩種方式來設置,分別是 http 頭信息中的Etag 和Last-Modified屬性。
(1)伺服器通過在響應頭中添加 Last-Modified 屬性來指出資源最後一次修改的時間,當瀏覽器下一次發起請求時,會在請求頭中添加一個 If-Modified-Since 的屬性,屬性值為上一次資源返回時的 Last-Modified 的值。當請求發送到伺服器後伺服器會通過這個屬性來和資源的最後一次的修改時間來進行比較,以此來判斷資源是否做了修改。如果資源沒有修改,那麼返回 304 狀態,讓客戶端使用本地的緩存。如果資源已經被修改了,則返回修改後的資源。使用這種方法有一個缺點,就是 Last-Modified 標注的最後修改時間只能精確到秒級,如果某些文件在1秒鍾以內,被修改多次的話,那麼文件已將改變了但是 Last-Modified 卻沒有改變,這樣會造成緩存命中的不準確。
(2)因為 Last-Modified 的這種可能發生的不準確性,http 中提供了另外一種方式,那就是 Etag 屬性。伺服器在返回資源的時候,在頭信息中添加了 Etag 屬性,這個屬性是資源生成的唯一標識符,當資源發生改變的時候,這個值也會發生改變。在下一次資源請求時,瀏覽器會在請求頭中添加一個 If-None-Match 屬性,這個屬性的值就是上次返回的資源的 Etag 的值。服務接收到請求後會根據這個值來和資源當前的 Etag 的值來進行比較,以此來判斷資源是否發生改變,是否需要返回資源。通過這種方式,比 Last-Modified 的方式更加精確。
當 Last-Modified 和 Etag 屬性同時出現的時候,Etag 的優先順序更高。使用協商緩存的時候,伺服器需要考慮負載平衡的問題,因此多個伺服器上資源的 Last-Modified 應該保持一致,因為每個伺服器上 Etag 的值都不一樣,因此在考慮負載平衡時,最好不要設置 Etag 屬性。
總結:
強緩存策略和協商緩存策略在緩存命中時都會直接使用本地的緩存副本,區別只在於協商緩存會向伺服器發送一次請求。它們緩存不命中時,都會向伺服器發送請求來獲取資源。在實際的緩存機制中,強緩存策略和協商緩存策略是一起合作使用的。瀏覽器首先會根據請求的信息判斷,強緩存是否命中,如果命中則直接使用資源。如果不命中則根據頭信息向伺服器發起請求,使用協商緩存,如果協商緩存命中的話,則伺服器不返回資源,瀏覽器直接使用本地資源的副本,如果協商緩存不命中,則瀏覽器返回最新的資源給瀏覽器。