直白理解一文搞定http協議快取

2021-10-22 03:16:25 字數 1520 閱讀 3408

由於http協議在快取機制這一塊做了很多次迭代。

並且每次迭代都做了向下相容(因為如果你不向下相容,一些頑固的古董的瀏覽器廠商不願意公升級就會沒有支援http協議了。為了遷就他們所以做了向下相容)

為了我們更好記住最新的,重要的,簡單的,常用的快取機制,我們先講終點。然後再掘墳,考古。

這個是http1.1的產物

小貼士

http協議有3個版本:

http1.0第乙個版本,主要是完成簡單的超文字傳輸

http1.1新增了拓展,快取機制,繪畫保持的長鏈結,新增狀態碼,host路由…

http2.0對效能優化,新增多路復用,優化http幀,壓縮算…基本上就是優化傳輸效能,畢竟現在資料越來越大,不優化不行。

在http世界裡面,瀏覽器本地和伺服器都有各自的快取機制,伺服器和客戶端都可以通過協商控制這兩個快取。

他們就是通過cache-control完成的。

他們可以通過這個指令,來實現,要不要讀取快取,讀取多老舊的快取,還是讀取最新資料,也可以實現,要不要寫入快取(客戶端和伺服器的快取)。

最常用的指令就是快取禁用了,直接在請求頭或者響應頭宣告, cache-control:no-store 即可 (no-store表示不寫快取,比較強勢,no-cache表示不讀取,沒那麼強勢)

if-match和if-none-match 配合 etag 實現快取改動檢驗,從而優化快取效能。

因為很多時候,快取時間過期了,並不意味著快取資料被更新。

所以為了檢測資料是否真的被更新。我們會對快取生產乙個類似md5摘要演算法的校驗碼,這個校驗碼就是etag.

如果校驗碼一致,自然就不更新了,即使過期時間到了,也不更新快取

那為什麼要搞 if-match和if-none-match 兩個指令呢?

他們的區別主要是對狀態碼進行控制。

先說現象再說結論:

先說現象,讀者自己細品。然後說結論,講我的個人看法,

我們有了etag後,自然就只有兩個結果,要麼etag識別資料沒改動,要麼etag識別資料被改動過。

if-match :

改動了返回 200

沒改動返回 304

if-none-match:

改動返回 412

沒改動返回 200

個人理解:

if-match 側重於盡可能的讀取資料,不惜任何效能代價(就算要遠端發起請求也要拿最新資料),不管成功還是沒成功,而且越新越好,返回200表示資料是最新的版本。

if-none-match 側重於效能優先,一定唯讀快取,如果讀不到就直接412,不讀了,感覺這個功能有點雞肋。

這個是舊版本的,功能跟 http1.1版本的 if-match 是乙個套路的。

唯一的區別是這個http1.0的機制依靠最近更新時間來檢測是否被改動,這明顯不靠譜,效能顯然沒有上面基於etag摘要演算法那麼好。

並且記得,禁用快取的最佳實踐是 cache-control:no-store。

基本上就算ok了。

一文搞懂HTTP和HTTPS協議

1.什麼是協議?網路協議是計算機之間為了實現網路通訊而達成的一種 約定 或者 規則 有了這種 約定 不同廠商的生產裝置,以及不同作業系統組成的計算機之間,就可以實現通訊。2.http協議是什麼?http協議是超文字傳輸協議的縮寫,他是從web伺服器傳輸超文字標記語言 html 到本地瀏覽器的傳送協議...

一文搞定聯合索引

聯合索引 上文講解了索引的底層結構,但是留了乙個尾巴,就是沒有去講復合索引。今天來繼續梳理復合索引,所謂復合索引即是由多個字段組成的一條索引。例如下表 create table test id int 4 notnull auto increment a varchar 10 not null b ...

一文搞定babel轉換

code轉換為ast 遍歷ast樹 進行修改 還原為code targets支援哪些瀏覽器 babel polyfill是將整個es2015 環境引入到全域性中,會造成全域性汙染require core js modules set 改變了原型,所以可以在例項上使用方法 通過配置usebuiltin...