使用ETag快取減少網路開銷

2021-09-12 03:22:21 字數 1283 閱讀 1434

使用etag快取減少網路開銷  現在http協議的發展已經很完善了,很多需求在http協議中都已經被支援。比如頁面快取這個需求,http就提供了多種快取功能。最常用的就是超時快取,設定乙個時間,在該時間段內瀏覽器使用快取的資料而不向伺服器發起請求。這種模式對伺服器而言是最省心的,因為不訪問伺服器所以可以大大減少伺服器的效能開銷。但是這種快取方式也有弊端,比如設定了快取後就無法從伺服器獲取到最新的資料。所以在實際應用中我們還需要其他快取方式來解決各種問題。etag快取就是為了解決這個問題而被提出的,但是它不能減少伺服器效能上的開銷,不過它可以有效的減少頻寬的占用。

etag的工作原理就是讓伺服器對向客戶端傳送的資料新增乙個識別符號,當頁面內容發生變化時識別符號也會隨著變化。客戶端向伺服器發起請求的時候帶上這個識別符號,如果識別符號沒有變化就說明頁面內容沒有變化。這時候伺服器就可以給客戶端返回乙個304狀態碼並斷開連線,這樣就不用從伺服器上把龐大的頁面資料再次傳送給客戶端了。只有當伺服器判斷客戶端傳送過來的識別符號和新生成的識別符號不同時,伺服器才會把新的資料傳送到客戶端,並返回乙個200狀態碼。

很多web伺服器都對靜態資源預設啟用了etag,但是動態資源伺服器本身就無力了。所以我們需要在程式中來控制。etag沒有固定的格式,一般用頁面資料的md5就可以了。下面是一段php實現etag的**。

<?php

//開啟ob,讓輸出的資料寫入緩衝區

ob_start();

//此處是頁面的**

//這裡用當前分鐘數做測試

echo time()/60|0;

//讀取ob緩衝區的所有資料

$s=ob_get_contents();

//關閉ob,並清空緩衝區

ob_end_clean();

//生成etag

$etag=md5($s);

//判斷客戶端請求的etag是否和當前頁面的etag相同

if($_server['http_if_none_match']==$etag)else;   這樣,首次訪問的時候是200的狀態碼,而之後訪問則是304。

?>

需要注意的是伺服器傳送給客戶端的etag是使用http頭的etag欄位,而客戶端使用這個etag請求伺服器的時候使用的是if-none-math欄位。這個在上面的http請求資訊中可以看到。所以php程式裡需要使用http_if_none_match來獲取客戶端提交過來的etag。

類似的,還有last-modified,是使用檔案的最後修改事件作為判斷的,它不需要呼叫計算md5,可以給伺服器減輕一些負擔。不過如果是動態頁就不存在最後修改時間這個說法,所以通用性不如etag。不過它也有自己的作用,以後再來說說它吧。

js快取變數,減少DOM操作開銷

dom是頁面元素物件的體現,dom是個樹,每個dom節點和其他節點有子父 兄弟關係,每次尋找的時候,都會一層層的去尋找,對於相同且已經查詢過的節點,每次都去重新找,如果節點層級關係多了,效能就很低了。每次 都會建立乙個新的jquery物件。在乙個事件 區域內的this物件,就是代表事件呼叫本物件。如...

如何使用SQL視窗子句減少語法開銷

sql是一種冗長的語言,其中最冗長的特性之一是視窗函式.在.最近遇到的堆疊溢位問題,有人要求計算某一特定日期的時間序列中的第乙個值和最後乙個值之間的差額 輸入 volume tstamp 29011 2012 12 28 09 00 0028701 2012 12 28 10 00 0028830 ...

scrapy 新增快取中介軟體 減少網路重複請求

目前公司做的爬蟲,不管測試還是爬取都是從網路直接請求資源,在除錯的時候個人感覺十分耗時間,效率太低。最近受到同事的啟發,做乙個本地快取來提高速度。print 從本地快取中取資料 return res except exception as e print middleware str e pass ...