程序員需要了解的瀏覽器緩存技術
做web開發的同學(前端工程師和后端工程師),經常遇到響應304,304的意思就是瀏覽器已經緩存,不需要走服務器,瀏覽器直接響應數據給用戶,最常用的解決瀏覽器緩存的問題,就是在靜態文件后面添加版本號,讓瀏覽器不響應緩存。那么web瀏覽器是怎么緩存數據的:
Expires
早起的web就是通過這個字段來告訴瀏覽器該緩存多久,這種緩存的原理是根據當前服務器的時間加上緩存有效的時間,最終生成未來某個失效時間值,返回給瀏覽器,比如失效時間點為2020 ,那么當用戶刷新頁面的時候,就會先判斷當前時間是否到2020年,如果沒到,瀏覽器把緩存的數據直接返回給用戶,不走web服務器,這種緩存的一個缺點就是:如果用戶修改了自己的本地時間,那么緩存可能失效。

Cache-control
因為Expires的缺點,后來的cache-control就做了改進,cache-control不再存絕對時間,存的是相對時間,比如緩存是60秒,需要注意的是如果你設置了max-age=60,那么在這60秒內,即使服務端修改了,你也得不到新的數據,所以這個使用要慎重,對應的另一個還有叫no-cache的,no-cahe并不是不緩存,而是每次都要和服務器做比較,如果服務器未更新那么就讀取緩存,反之讀取新的,與no-cache對應的就是no-store。no-store才是真的告訴瀏覽器不要讀取緩存的意思。

Last-Modified和If-Modified-Since
Last-Modified是服務器返回給瀏覽器的
If-Modified-Since是瀏覽器告訴服務器的
舉個例子,如果你訪問個url,肯定沒緩存走服務器,服務器返回個Last-Modified,即這個資源最近被修改的時間A,響應的http狀態碼是200,同時瀏覽器把這個時間A存起來,下次請求的時候,瀏覽器會帶著這個If-Modified-Since去和服務器做對比,如果說,兩次的時間一樣,那么就是資源沒更新,瀏覽器直接返回自己緩存的資源,響應的http狀態碼是304,如果說兩次時間不一樣,那么服務器再次返回Last-Modified時間和200的http狀態碼。但是這種策略也有缺點,就是時間最小單位是1s,如果說1秒內發了好幾次更新,瀏覽器就不知道了。

Etag和If-no-match
由于Last-Modified不支持秒級的變化,后來出現了Etag,Etag是文件修改時間等hash的結果,不存具體時間值,這樣每次請求的時候,瀏覽器會帶上If-no-match和服務器的Etag做對比,如果一樣,走緩存,不一樣,走服務器,然后緩存起來,可以精確到秒級
