緩存系列之一:buffer、cache與瀏覽器緩存

緩存系列之一:buffer、cache與瀏覽器緩存php

一:緩存是爲了調節速度不一致的兩個或多個不一樣的物質的速度,在中間對速度較快的一方起到一個加速訪問速度較慢的一方的做用,好比CPU的一級、二級緩存是保存了CPU最近常常訪問的數據,內存是保存CPU常常訪問硬盤的數據,並且硬盤也有大小不一的緩存,甚至是物理服務器的raid 卡有也緩存,都是爲了起到加速CPU 訪問硬盤數據的目的,由於CPU的速度太快了,CPU須要的數據硬盤每每不能在短期內知足CPU的需求,所以PCU緩存、內存、Raid 卡以及硬盤緩存就在必定程度上知足了CPU的數據需求,即CPU 從緩存讀取數據能夠大幅提升CPU的工做效率。node

1.1:理解buffer和cache:
buffer:緩衝也叫寫緩衝,通常用於寫操做,能夠將數據先寫入內存在寫入磁盤,buffer 通常用於寫緩衝,用於解決不一樣介質的速度不一致的緩衝,先將數據臨時寫入到裏本身最近的地方,以提升寫入速度。
CPU會把數據線寫到內存的磁盤緩衝區,而後就認爲數據已經寫入完成看,而後內核的線程在後面的時間在寫入磁盤,因此服務器忽然斷電會丟失內存中的部分數據。
cache:緩存也叫讀緩存,通常用於讀操做,CPU讀文件從內存讀,若是內存沒有就先從硬盤讀到內存再讀到CPU,將須要頻繁讀取的數據放在裏本身最近的緩存區域,下次讀取的時候便可快速讀取。nginx

1.2:cache的保存位置:
客戶端:瀏覽器
內存:本地服務器、遠程服務器
硬盤:本機硬盤、遠程服務器硬盤
速度對比:
客戶端瀏覽器-內存-遠程內存-硬盤-遠程硬盤chrome

1.3:cache的特性:瀏覽器

1.過時時間
2.強制過時,源網站更新圖片後CDN是不會更新的,須要強制是圖片緩存過時
3.命中率,即緩存的讀取命中率緩存

1.4:將內存的數據保存到硬盤,而後清空內存,可能有些內存的數據是進程死掉沒法釋放的:
#sync # 將緩衝區中的數據快速寫入到硬盤
# cat /proc/sys/vm/drop_caches
0
#1是用來清空最近放問過的文件頁面緩存
#2是用來清空文件節點緩存和目錄項緩存
#3是用來清空1和2全部內容的緩存。服務器

二:用戶層緩存:
2.1:DNS 緩存:
2.1.1:默認爲60秒,即60秒以內在訪問同一個域名就不在進行DNS解析:
查看chrome瀏覽器的DNS緩存:
chrome://net-internals/#dns網站

2.1.2:DNS 預獲取,僅在HTML 5中支持,當一個頁面中包含多個域名的時候瀏覽器會先嚐試解析域名並進行緩存,以後再使用的時候便可直接只有不須要再進行DNS 解析:

2.2:瀏覽器緩存:
2.2.1:火狐瀏覽器的緩存位置:url

2.2.2:文件的訪問時間、最後修改時間和更改時間:spa

# stat index.php 
File: ‘index.php’
Size: 4311 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d    Inode: 68497957 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 497/ nginx) Gid: ( 497/ nginx)
Access: 2017-07-21 02:00:03.046492759 +0800    # 最後一次讀取的時間
Modify: 2016-04-07 18:32:47.000000000 +0800    # 最後一次更改內容致使block內容發生變化的時間
Change: 2017-01-11 15:55:35.872038074 +0800    # 權限等發生更改致使inode發送變化的時間

2.2.3:緩存協商機制之最後修改時間:系統調用會獲取文件的最後修改時間,若是沒有發生變化就返回給瀏覽器304的狀態碼,表示沒有發生變化,而後瀏覽器就使用的本地的緩存展現資源


2.2.4:緩存協商之Etag:
瀏覽器在返回的報文中包含一個etag的標記,而後瀏覽器將etag保存,再次收到Etag的時候會進行判斷,若是Etag沒有發生變化就使用本地緩存

2.2.5:緩存協商之過時時間,以上兩種都須要發送請求,即無論資源是否過時都要發送請求進行協商,這樣會消耗沒必要要的時間,所以有了緩存的過時時間,即第一次請求資源的時候帶一個資源的過時時間,默認爲30天,當前這種方式使用的比表較多,可是沒法保證客戶的時間都是準確而且一致的,所以假如一個最大生存週期,使用用戶本地的時間計算緩存數據是否超過多少天,下面的過時時間爲2017年,可是緩存的最大生存週期計算爲天等於691200秒即2天,過時時間以下:

最大生存週期,單位爲秒,根據客戶端的時間日後計算是否超出緩存天數

三:關於刷新:
3.1:在瀏覽器輸入地址欄直接按回車:
瀏覽器的全部沒有過時的數據直接使用本地緩存,即沒有過時的數據不會發送緩存協商的請求。

3.2:按F5或者瀏覽器上的刷新按鈕:
瀏覽器會在請求頭部附加緩存協商報文,瀏覽器不能直接使用本地緩存,須要經過驗證纔可使用,可是過時時間沒有超過日期的緩存不受影響,受影響的是最後修改時間和Etag。

3.3:ctrl+F5或者是按住ctrl+刷新,這是強制刷新,瀏覽器將發送全部的請求到服務器,不會使用本地緩存

3.4:如何讓客戶端獲取最新的服務器數據資源:

3.4.1:更改資源名稱,這樣每次都得改,比較麻煩並且容易出錯

3.4.2:增長時間戳,新版本的使用較新的時間戳,瀏覽器發現時間較新就會獲取新的資源,例如xxx.js?20170724比xxx.js?20170101新

3.4.3:靜態資源使用CDN要加參數,好比URL 能夠帶參數,帶參數的話CND會對該url進行hash計算,當源url資源發送變化(故意的把參數更改,由於靜態資源更新了,要求CND也更新)CDN 發現hash值不同就會進行更新,另外CDN 能夠根據後綴名判斷加不加參數,即某些後綴的有參數有些後綴沒有參數

相關文章
相關標籤/搜索