1. 程式人生 > >緩存系列之一:buffer、cache與瀏覽器緩存

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

網站 按鈕 強制 根據 3.4 發生 htm 多少 pan

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

一:緩存是為了調節速度不一致的兩個或多個不同的物質的速度,在中間對速度較快的一方起到一個加速訪問速度較慢的一方的作用,比如CPU的一級、二級緩存是保存了CPU最近經常訪問的數據,內存是保存CPU經常訪問硬盤的數據,而且硬盤也有大小不一的緩存,甚至是物理服務器的raid 卡有也緩存,都是為了起到加速CPU 訪問硬盤數據的目的,因為CPU的速度太快了,CPU需要的數據硬盤往往不能在短時間內滿足CPU的需求,因此PCU緩存、內存、Raid 卡以及硬盤緩存就在一定程度上滿足了CPU的數據需求,即CPU 從緩存讀取數據可以大幅提高CPU的工作效率。

1.1:理解buffer和cache:
buffer:緩沖也叫寫緩沖,一般用於寫操作,可以將數據先寫入內存在寫入磁盤,buffer 一般用於寫緩沖,用於解決不同介質的速度不一致的緩沖,先將數據臨時寫入到裏自己最近的地方,以提高寫入速度。
CPU會把數據線寫到內存的磁盤緩沖區,然後就認為數據已經寫入完成看,然後內核的線程在後面的時間在寫入磁盤,所以服務器突然斷電會丟失內存中的部分數據。
cache:緩存也叫讀緩存,一般用於讀操作,CPU讀文件從內存讀,如果內存沒有就先從硬盤讀到內存再讀到CPU,將需要頻繁讀取的數據放在裏自己最近的緩存區域,下次讀取的時候即可快速讀取。

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

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:火狐瀏覽器的緩存位置:

技術分享

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

# 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 可以根據後綴名判斷加不加參數,即某些後綴的有參數有些後綴沒有參數

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