精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HTTP 的緩存為什么這么設計?

開發 前端
HTTP 設計了緩存的功能,可以把下載的資源保存起來,再打開網頁的時候直接讀緩存,速度自然會快很多。

作為前端開發,緩存是整天接觸的概念,面試必問、工作中也頻繁接觸到,可能大家對緩存的 header 記的比較熟了,可是大家有沒有思考過為什么 HTTP 的緩存控制要這么設計呢?

首先,為什么要有緩存?

網頁中的代碼和資源都是從服務器下載的,如果服務器和用戶的瀏覽器離得比較遠,那下載過程會比較耗時,網頁打開也就比較慢。下次再訪問這個網頁的時候,又要重新再下載一次,如果資源沒有啥變動的話,那這樣的重新下載就很沒必要。所以,HTTP 設計了緩存的功能,可以把下載的資源保存起來,再打開網頁的時候直接讀緩存,速度自然會快很多。

而且,每個請求都要服務端做相應的處理,比如解析 url,讀取文件,返回響應等,而服務器能同時處理的請求是有上限的,也就是負載是有上限的,所以如果能通過緩存減少沒必要的資源的請求,就能解放服務器,讓它去處理一些更有意義的請求。

綜上,為了提高網頁打開速度,降低服務器的負擔,HTTP 設計了緩存的功能。

那 HTTP 是怎么設計的緩存功能呢?

如果讓大家設計 HTTP 的緩存功能,大家會怎么設計呢?

最容易想到的就是指定一個時間點了,到這個時間之前都直接用緩存,過期之后才去下載新的。

HTTP 1.0 的時候也是這么設計的,也就是 Expires 的 header,它可以指定資源過期時間,到這個時間之前不去請求服務器,直接拿上次下載好被緩存起來的內容,

Expires: Wed, 21 Oct 2021 07:28:00 GMT

但是這種設計有個 bug,不知道大家能猜出來不。

首先這個時間是指 GMT 時間,也就是會轉化為格林尼治那個時區的時間,不存在時區問題。

服務端會把當地的時間轉化為 GMT 時間,比如當前是某個時間點 xxx,想緩存的時間為 yyy,那 Expires 就設置為 xxx + yyy 的時間。

如果瀏覽器的時間是準確的,那轉化為 GMT 時間后應該也是 xxx,所以緩存的時間就是 yyy。

這是理想中的情況。

但萬一瀏覽器的時間不準呢?轉化為 GMT 時間之后就不是 xxx,那具體緩存的時間也就不是 yyy 了,這就是問題。

所以,這個過期時間不能讓服務端來算,應該讓瀏覽器自己算。

這也是為什么在 HTTP 1.1 里面改為了 max-age 的方式:

Cache-Control: max-age=600

上面就代表資源緩存 600 秒,也就是 10 分鐘。

讓瀏覽器來自己算啥時候過期,也就沒有 Expires 的問題了。(這也是為什么同時存在 max-age 和 Expires 會用 max-age 的原因)

當然,不同的資源會有不同的 max-age,比如打開 b 站首頁你會看到不同資源的 max-age 是不同的:

比如一些庫的 js 文件就設置了 31536000,也就是 1 年后過期,因為一般也不會變,以年為單位沒啥問題。

而業務的 js 文件設置了 600,也就是 10 分鐘過期,業務代碼經常會變動嘛。

細心的同學可能會發現之前都是 key: value 形式的 header,現在咋變成了 key: k1=v1,k2=v2 的形式了呢?

沒錯,這也是 HTTP 1.1 做的設計,他們想把緩存相關的 header 都集中到一起,所以就包了一層,都放在 Cache-Control 的 header 里。

所以名字上也就不一樣了,Expires: xxx 這種叫做消息頭(header),而 Cache-Control: max-age=xxx 里面的 max-age 叫做指令(directive)。

好了,改成 max-age 之后,瀏覽器就會在本地計算出的過期時間就去下載新的資源了。

但是這樣就行了么?

只是到了過期時間,但是資源并不一定有變化呀,那再下載一次同樣的內容還是很沒必要。

所以要和服務端確認下是否內容真的變了,變了的話就重新下載,否則的話就不用再下載了,有這樣一個協商的過程。

所以 HTTP 1.1 又設計了協商緩存的 header。

我們說到資源過期了,瀏覽器要和服務端確認下是否有更新,怎么判斷資源過期呢?

比較容易想到可以通過文件內容的 hash,也可以通過最后修改時間,這倆分別叫 Etag 和 Last-Modified:

服務端返回資源的時候就會帶上這倆 header。

那在 max-age 時間到了的時候,就可以帶上 etag 和 last-modified 就請求服務器,問下是否資源有更新。

帶上 etag 的 header 叫做 If-None-Match:

If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"

帶上 last-modified 時間的叫做 If-Modified-Since:

If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

服務端判斷下如果資源有變化,那就返回 200,并在響應體帶上新的內容,瀏覽器就用這份新下載的資源。

如果沒有變化,那就返回 304,響應體是空的,瀏覽器會直接讀緩存。

這樣多了一個協商的階段,那在本地緩存過期但是服務端改資源沒有變化的時候就能避免重復的下載。

那如果文件確定不會變,不需要協商的話,怎么告訴瀏覽器呢?可以用 immutable 的 header 來告訴瀏覽器,這個資源就是不變的,不用協商了。這樣就算緩存過期了也不會發驗證的 header(If-None-Match 和 If-Modified-Since):

Cache-control: immutable

我們前面講了 HTTP 1.1 改成了 Cache-control: k1=v1,k2=v2 的形式,那除了 max-age 還有啥其他的 directive 呢?

前面我們講的都是瀏覽器的緩存控制,但請求從瀏覽器到服務器的過程中,中間可能經過很多層代理。

代理服務器的緩存怎么控制?

瀏覽器里的緩存都是用戶自己的,叫做私有緩存,而代理服務器上的緩存大家都可以訪問,叫做公有緩存。

如果這個資源只想瀏覽器里緩存,不想代理服務器上緩存,那就設置 private,否則設置 public:

比如這樣設置就是資源可以在代理服務器緩存,緩存時間一年(代理服務器的 max-age 用 s-maxage 設置),瀏覽器里緩存時間 10 分鐘:

Cache-control:public, max-age=600,s-maxage:31536000

這樣設置就是只有瀏覽器可以緩存:

Cache-control: private, max-age=31536000

而且,緩存過期了就完全不能用了么?

不是的,其實也想用過期的資源也是可以的,有這樣的指令:

Cache-control: max-stale=600

stale 是不新鮮的意思。請求里帶上 max-stale 設置 600s,也就是說過期 10 分鐘的話還是可以用的,但是再長就不行了。

Cache-control: stale-while-revalidate=600

也可以設置 stale-while-revalidate,也就是說在和瀏覽器協商還沒結束的時候,就先用著過期的緩存吧。

Cache-control: stale-if-error=600

或者設置 stale-if-error,也就是說協商失敗了的話,也先用著過期的緩存吧。

所以說,max-age 的過期時間也不是完全強制的,是可以允許過期一段時間的。

那如果我想強制在緩存還沒協商完的時候不用過期的緩存怎么辦呢?

用這個指令 must-revalidate:

Cache-Control: max-age=31536000, must-revalidate

名字上就可以看出來,就是緩存失效了的話,必須等驗證結束,中間不能用過期的緩存。

可能有的同學會有疑問,緩存不都是自己設置的么,咋還一個允許過期,一個禁止過期呢?

自己會同時用這兩種和自己玩么?

自己肯定不會,但是 CDN 廠商可能會呀,想禁止這種用過期緩存的行為,就可以設置這個 must-revalidate 指令。

最后,HTTP 當然也支持禁止緩存,也就是這樣:

Cache-control: no-store

設置了 no-store 的指令就不會緩存文件了,也就沒有過期時間和之后的協商過程。

如果允許緩存,但是需要每次都協商下的話就用 no-cache:

Cache-control: no-store

可能有的同學對 no-cache 和 must-revalidate 的區別比較迷糊,我們理一下:

no-cache 相當于禁掉了強緩存,每次都要協商下,而 must-revalidate 只是在強緩存過期之后,禁止掉了用過期的緩存的過程,強制必須協商。

至此,http 的緩存設置我們就講完了,來總結一下:

總結

緩存能加快也面的打開速度,也能減輕服務器壓力,所以 HTTP 設計了緩存機制。

HTTP 1.0 的時候是使用 Expires 的 header 來控制的,指定一個 GMT 的過期時間,但是當瀏覽器時間不準的時候就有問題了。

HTTP 1.1 的時候改為了 max-age 的方式來設置過期時間,讓瀏覽器自己計算。并且把所有的緩存相關的控制都放到了 Cache-control 的 header 里,像 max-age 等叫做指令。

緩存過期后,HTTP 1.1 還設計了個協商階段,會分別通過 If-None-Match 和 If-Modified-Since 的 header 帶資源的 Etag 和 Last-Modied 到服務端問下是否過期了,過期了的話就返回 200 帶上新的內容,否則返回 304,讓瀏覽器拿緩存。

除了 max-age 的指令外,我們還學了這些指令:

  • public:允許代理服務器緩存資源。
  • s-maxage:代理服務器的資源過期時間。
  • private:不允許代理服務器緩存資源,只有瀏覽器可以緩存。
  • immutable:就算過期了也不用協商,資源就是不變的。
  • max-stale:過期了一段時間的話,資源也能用。
  • stale-while-revalidate:在驗證(協商)期間,返回過期的資源。
  • stale-if-error:驗證(協商)出錯的話,返回過期的資源。
  • must-revalidate:不允許過期了還用過期資源,必須等協商結束。
  • no-store:禁止緩存和協商。
  • no-cache:允許緩存,但每次都要協商。

雖然 HTTP 緩存相關的指令還是挺多的,但是都是圍繞 max-age 和過期后的協商來設計的,思路理清的話,還是很容易就能記住的。

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2022-05-30 10:23:59

HTTPHTTP 1.1TCP

2022-06-13 21:52:02

CDN網絡節點

2011-01-28 08:55:44

網頁設計Web

2019-07-16 16:00:31

HTTP時延服務

2013-06-18 10:30:45

Disruptor框架

2018-08-16 08:03:21

Python語言解釋器

2024-02-26 21:15:20

Kafka緩存參數

2020-02-27 15:44:41

Nginx服務器反向代理

2022-06-02 08:03:19

PyCharmPython代碼

2019-08-30 14:58:47

JavaScript程序員編程語言

2013-03-04 10:10:36

WebKit瀏覽器

2020-02-27 21:03:30

調度器架構效率

2016-12-28 11:28:19

.NET反射

2020-08-14 09:11:29

RedisQPS數據庫

2012-08-17 10:01:07

云計算

2020-03-30 15:05:46

Kafka消息數據

2020-06-16 14:13:50

Kubernetes容器Linux

2024-03-07 10:21:56

2014-05-26 17:00:51

2020-09-27 08:12:09

Nginx反向代理負載均衡
點贊
收藏

51CTO技術棧公眾號

伊人色**天天综合婷婷| 搜成人激情视频| 91网站黄www| 国产成人亚洲综合| 欧美日韩色视频| 国产精品传媒| 欧美综合久久久| 国产日韩欧美大片| 欧美美女搞黄| 狠狠色狠狠色综合日日91app| 国模精品视频一区二区三区| 91禁男男在线观看| 加勒比中文字幕精品| 欧美三级日韩在线| 日本a视频在线观看| 在线观看免费版| 91亚洲资源网| 亚洲精品免费网站| 中文字幕在线观看视频一区| 先锋影音久久久| 欧美激情亚洲视频| 日韩精品一区二区三区在线视频| 偷拍精品福利视频导航| 日韩精品中文字幕一区| 欧美美女性视频| 在线观看精品| 欧美性猛交xxxx富婆弯腰| 日本男女交配视频| 成人免费观看视频大全| 国产精品日韩成人| 91精品国产成人观看| 欧美日韩国产欧美日美国产精品| a在线视频观看| 日本不卡影院| 亚洲色图在线视频| 亚洲国产欧洲综合997久久 | 久久久久久久久四区三区| 99免费在线视频| 麻豆91在线播放免费| 日本老师69xxx| 国产成人在线观看网站| 亚洲午夜伦理| 欧美丰满片xxx777| 免费在线观看亚洲| 欧美激情精品久久久六区热门| www.日韩欧美| www日韩在线| 日本久久黄色| 尤物99国产成人精品视频| 国产色视频一区二区三区qq号| 首页亚洲中字| 亚洲欧美日韩一区在线| 波多野结衣a v在线| 国产91一区| 一区二区亚洲精品国产| 欧美性受xxxx黑人| 色婷婷一区二区三区| 俺去亚洲欧洲欧美日韩| 在线观看美女av| 欧美99久久| 国内精品久久影院| 免费观看成人毛片| 日韩电影免费一区| 成人网在线视频| 国内精品国产成人国产三级| 国产成人精品午夜视频免费| 国产欧美日韩一区二区三区| 香蕉视频免费在线看| 久久久久久久久久久黄色| 五月天婷亚洲天综合网鲁鲁鲁| 午夜激情在线观看| 亚洲精品日韩一| 免费不卡av在线| 性欧美hd调教| 91麻豆精品国产自产在线| 黄色性视频网站| 自拍偷拍欧美一区| 久久精品国产2020观看福利| 久久免费视频99| 国产精品日韩精品欧美精品| 国产精品视频永久免费播放| 国产丰满美女做爰| 91年精品国产| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 尤物yw193can在线观看| 懂色aⅴ精品一区二区三区蜜月| 欧美精品性生活| 日韩一二三区在线观看| 亚洲精品日韩久久久| 国产免费一区二区三区四区| 亚洲九九精品| 国产精品一久久香蕉国产线看观看| 国产人妖在线播放| 91蝌蚪porny| www.99riav| 六月婷婷综合| 精品国内二区三区| 少妇太紧太爽又黄又硬又爽小说| 亚洲视频狠狠| 国产精自产拍久久久久久| 黑人操亚洲女人| 国产精品久久免费看| 91精品国产综合久久精品| 亚洲污视频在线观看| a级日韩大片| 中文字幕不卡av| 美国av一区二区三区| 日韩亚洲在线观看| 亚洲国产精一区二区三区性色| 久久精品九九| 超碰97在线人人| 999国产在线视频| 精品欧美激情精品一区| 久久久九九九热| 欧美精品一区二区久久| 欧美极品在线播放| 国产精品视频无码| 久久精品视频一区二区三区| 大伊香蕉精品视频在线| 91麻豆精品| 国产亚洲一区精品| 精品国产免费观看| 国产91丝袜在线播放九色| 天天综合中文字幕| 97精品国产综合久久久动漫日韩 | 久久久久久久久久久久久久| 日韩免费av片在线观看| 亚洲av成人精品毛片| 亚洲综合在线视频| 中文字幕第一页在线视频| 成人无号精品一区二区三区| 欧美一级高清免费| 日本xxxxwww| 亚洲一区二区视频在线观看| 日本一区二区三区在线免费观看| 久久神马影院| 国产精品影片在线观看| www.中文字幕久久久| 在线一区二区三区四区五区| 超碰97人人干| 免费在线成人| 欧美久久久久久| 韩国久久久久久| 亚洲欧美制服丝袜| 日本黄色一级视频| 国产午夜精品一区二区| 国产裸体免费无遮挡| 精品99在线| 国产精品免费在线免费| 色网站在线看| 3d动漫精品啪啪一区二区竹菊 | 五月天丁香社区| 狠久久av成人天堂| 国产一区福利视频| 午夜不卡影院| 国产亚洲成av人片在线观看桃| 日韩免费av网站| 国产精品色哟哟网站| 亚洲精品成人在线播放| 综合一区av| 国产精品v欧美精品v日韩| av资源中文在线| 日韩精品中文字幕在线播放| 国产午夜无码视频在线观看| 亚洲国产成人私人影院tom| 一区二区三区不卡在线| 最新欧美色图| 亚洲四色影视在线观看| 怡红院男人的天堂| 中文字幕中文在线不卡住| www.超碰97.com| 欧美精品一区二区三区久久久竹菊| 丁香婷婷久久久综合精品国产| 91丝袜在线| 亚洲新中文字幕| 91tv国产成人福利| 亚洲一卡二卡三卡四卡 | 欧美成人精品网站| 国产精品电影院| 2018国产精品| 久久久久免费| 手机在线视频你懂的| 久久悠悠精品综合网| 国产精品露脸自拍| 手机av在线播放| 亚洲欧洲在线视频| 91福利免费视频| 亚洲午夜电影网| 欧美性猛交xxxx乱| 国产成人鲁色资源国产91色综| 那种视频在线观看| 亚洲字幕久久| 九九九九精品九九九九| 伊人亚洲精品| 欧美一级大片视频| 成年人黄视频在线观看| 日韩精品视频中文在线观看 | 人妖欧美一区二区| 精品人妻大屁股白浆无码| 国产探花在线精品一区二区| julia一区二区中文久久94| 日本精品在线中文字幕| 久久久久久亚洲| 免费看美女视频在线网站| 日韩国产欧美精品在线| 国产永久免费视频| 日韩欧美在线观看视频| 久久久久久久极品内射| 国产精品日韩精品欧美在线| 三上悠亚ssⅰn939无码播放 | 波多野结衣久久| 最近2019中文字幕在线高清| 午夜黄色小视频| 欧美大黄免费观看| 一卡二卡三卡在线观看| 色激情天天射综合网| 免费在线观看黄网站| 亚洲激情图片qvod| 中文字幕乱码av| 欧美—级在线免费片| 麻豆国产精品一区| 丁香婷婷综合色啪| 久久久久亚洲av无码麻豆| 精品在线观看免费| 色婷婷狠狠18| 日韩va亚洲va欧美va久久| 国产aaa一级片| 99这里有精品| 无码 制服 丝袜 国产 另类| 国产精品成人一区二区网站软件| 一级一片免费播放| 成人免费av| 日本一区二区三区视频免费看| 婷婷成人在线| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 国产mv久久久| 国产免费不卡| 国产精品96久久久久久又黄又硬| 亚洲欧洲高清| 国产91色在线|| 国产精品粉嫩| 国产精品久久久久久av福利| 澳门av一区二区三区| 国产精品老女人精品视频| 久久精品xxxxx| 成人精品一区二区三区| 久久天堂久久| 国产 高清 精品 在线 a| 一区二区三区四区精品视频| 懂色一区二区三区av片| 极品国产人妖chinesets亚洲人妖| 国内不卡一区二区三区| 日韩激情毛片| 日韩精品一区二区三区四区五区| 第一会所亚洲原创| 男同互操gay射视频在线看| 中文字幕一区二区三区欧美日韩| 女人色极品影院| 一本色道久久精品| 国产v亚洲v天堂无码久久久| 蜜臀精品一区二区三区在线观看 | 国产男男gay网站| 555夜色666亚洲国产免| 欧美性受xxxx狂喷水| 国产丝袜一区二区三区免费视频| 国产三级视频在线| 日韩亚洲精品电影| 青草在线视频在线观看| 欧美一区二区视频97| 黄色成人在线观看网站| 91精品国产高清久久久久久91裸体 | 新版中文在线官网| 97色在线观看| 巨胸喷奶水www久久久免费动漫| 成人午夜高潮视频| 奇米777国产一区国产二区| 日本一区二区在线| 夜间精品视频| 凹凸国产熟女精品视频| 天堂va蜜桃一区二区三区漫画版| 欧美一级xxxx| 波多野结衣一区二区三区| 丁香激情五月少妇| 亚洲婷婷综合久久一本伊一区 | 欧美亚洲综合网| 99精品在线视频观看| 精品亚洲一区二区三区在线观看| 青青青青在线| 久久久伊人欧美| 国产成人a视频高清在线观看| 成人在线免费网站| 欧美另类69xxxxx| 日韩国产小视频| 日韩电影在线一区二区三区| 无码人妻精品一区二区三| 中文字幕久久午夜不卡| 亚洲国产精品成人无久久精品| 欧美熟乱第一页| 香蕉视频免费看| 精品中文字幕在线| 国产精品久久久久久久久免费高清 | 亚洲成a人无码| 国产精品视频你懂的| 日韩av电影网| 日韩一区二区影院| 北条麻妃在线| 91精品国产成人www| 精品一区二区三区中文字幕在线| 欧美日韩一区二区三区免费| 国模一区二区三区| 色乱码一区二区三区在线| 97久久超碰国产精品电影| 看片网站在线观看| 欧美日韩亚洲不卡| 国产在线小视频| 午夜精品理论片| 久久69av| 国产四区在线观看| 青草av.久久免费一区| 久久精品国产综合精品| 精品成人一区二区三区免费视频| 久久国产精品视频| 欧美日韩大片在线观看| 91成人在线免费观看| 日本久久一级片| 久久国产天堂福利天堂| 欧美日韩尤物久久| 久久精彩视频| 一区在线免费| avtt中文字幕| 亚洲男人的天堂在线观看| 亚洲网站免费观看| 在线观看欧美成人| 在线成人视屏 | 欧美激情精品久久久久久久变态| 亚洲香蕉久久| 自拍偷拍视频在线| 久久国产尿小便嘘嘘| 国产日产在线观看| 欧美日韩免费高清一区色橹橹| av网站在线免费播放| 国产精品欧美激情| 成人久久综合| 在线观看免费视频高清游戏推荐| 国产精品欧美一级免费| 艳妇乳肉豪妇荡乳av无码福利| 亚洲色图综合久久| 日韩中文影院| 一区二区精品视频| 极品尤物av久久免费看| 国产精品视频一区二区三| 欧美一区二区三区不卡| 超碰porn在线| 成人免费视频观看视频| 亚洲免费黄色| 日本少妇色视频| 色婷婷激情综合| www.亚洲免费| 亚洲va欧美va国产综合久久| 欧美日本亚洲韩国国产| 天天躁日日躁狠狠躁av麻豆男男| 五月婷婷综合网| 邻居大乳一区二区三区| 国产精品久久久久久五月尺| 偷偷www综合久久久久久久| 国产精品中文久久久久久| 午夜亚洲福利老司机| 欧美人体大胆444www| 国产精品视频久| 欧美粗暴jizz性欧美20| 中国极品少妇xxxx| 在线国产亚洲欧美| 欧美精品videos另类| αv一区二区三区| 久久国产成人| www.99re6| 亚洲精品第一页| 欧美爱爱视频| 免费观看国产精品视频| 欧美经典一区二区三区| 亚洲欧美另类视频| 日韩av免费在线观看| 亚洲乱码电影| 国产精品jizz| 欧美一区二区免费观在线| 僵尸再翻生在线观看| 亚洲精品一区二| 成人激情小说网站| 中文字幕永久在线| 欧美精品videossex88| 国模精品一区| 国产成人av片| 欧美性受极品xxxx喷水| 男男gaygays亚洲| 亚洲欧洲免费无码| 99re成人精品视频| 国产草草影院ccyycom| 国产精品jizz在线观看麻豆| 欧美激情 亚洲a∨综合| 天天躁夜夜躁狠狠是什么心态|