十年大數據架構師教你如何設計緩存架構

大數據 Windows CSS Apache 小風IT互動 小風IT互動 2017-08-27

由於大數據的迅猛發展,數據呈幾何倍數增長,大家不得不討論關於系統性能的優化問題,而談到性能優化,勢必要談到緩存架構的設計與使用。幾乎是所有人都知道緩存的威力,但是知道終歸只是知道,如何真正合理的在自己的項目中進行使用,又是另外一回事了,還是用幾個問題來探討一下,讓正在學習大數據的小夥伴更好的瞭解緩存技術。

在哪些地方可以使用緩存?這裡用一個圖可能表述的更加清楚!

十年大數據架構師教你如何設計緩存架構

489034603

不僅僅如此,還有數據庫本身也會有緩存,而且操作系統也有會緩存一些數據。所以,充分的使用好緩存,對性能提升相當的大。

既然談到緩存,那麼就談細緻一點,因為很多時候:談大帽子的話很多人都會滔滔不絕,但是一到真實的細節與落實的地方,很多人就偃旗息鼓了。

首先就來看看瀏覽器的緩存。

做過網站的朋友都知道,這個設置主要就是通過設置:Cache-Control 這個響應頭來實現的,如下:

十年大數據架構師教你如何設計緩存架構

489034603

不同的技術平臺,實現的方式不一樣,大家也不要糾結這些平臺的差異,只要最後結果是一樣的就OK了,要懷著包容心去看每一種技術,如果連技術的差異性都無法容忍,未必也太小家子氣了,呵呵呵。

例如,在微軟技術的ASP.NET中,可以通過幾種方式來實現:

1.頁面中設置,如下:

十年大數據架構師教你如何設計緩存架構

489034603

2.代碼中設置,如下:

十年大數據架構師教你如何設計緩存架構

489034603

3.IIS中設置,如下:

十年大數據架構師教你如何設計緩存架構

489034603

瀏覽器緩存可以緩存圖片,js,css,當然,還可以把一些數據,通過js對象的形式保存在瀏覽器中。

瀏覽器緩存的問題主要在於圖片,js,css的更新上面。

例如如果我們設置了緩存的時間為1一個月,那麼這些資源很有可能就在一個月還沒有到就因為我們發佈新的版本而更新了。這個時候,瀏覽器不會知道的,還是會使用老的版本。

這不是我們希望看到的,解決的辦法也是很簡單,如果大家留心點,就會發現很多的站點的js,css是這樣命名的:XXX-1.2.js

下面看代理緩存,代理緩存的問題,主要出現在三個方面:

1.安全

2.地區問題

3.內容更新問題

首先,對於安全問題,這是最大的問題:因為代理會把根據URL,把整個頁面的數據緩存起來,其中就包括了響應頭,那麼就包含了cookie信息。問題就在這裡啦,如果用戶A登錄之後,代理緩存了頁面的響應,那麼用戶B在此請求相同的頁面的時候,那麼整個響應就會給B了,這個時候,用戶B就可以以A的身份進去瞎搞了。

對於這個問題,沒有辦法解決,但是有辦法避免:把一些不需要用戶登錄就可以訪問的頁面,特別是那些靜態的內容的頁面,可以設置代理緩存;涉及到用戶驗證才能看的頁面,不要設置了。

其次,就是地區問題,

因為代理緩存了整個頁面,而且是根據URL來匹配的,如果咱們中國人去訪問一個頁面,例如www.agilesharp.com/blog/12344,這個時候,代理緩存就把這個中文的頁面內容緩存,如果我們的站點是支持多語言的,那麼,此時,如果美國人去訪問了同一個URL,那麼這個時候,或許,請求不會提交給我們的服務器,代理就會把中文的頁面內容給老美,那叫一個鬱悶,是吧。

怎麼辦?呵呵,方法雖然鮮為人知,但是依然簡單。

設置頭信息:Accept-Language

在發送中文響應的時候,設置為:Accept-Language: zh-cn,那麼代理緩存就會緩存這個版本的內容

如果是請求的英文,那麼,老美的瀏覽器發送的請求的這個Accept-Language的信息就是 en-US,代理一看這樣版本的內容沒有,那麼就會把請求交給我們的服務器了。

最後的結果就是代理中緩存了同一個頁面的不同版本的內容

好了,現在到了服務器端了,首先看看內核緩存!

其實這個內核緩存就涉及到操作系統和宿主(IIS,Apache等)

說實在的,我對Windows操作系統和IIS比較瞭解,對其他的不清楚,但是我相信:原理和思想都是一樣的!

我先以Windows和IIS為例子吧,說完之後,如果熟悉Liunx,Apache等其他平臺的朋友,可以一併分享一下。

首先看一個圖:

十年大數據架構師教你如何設計緩存架構

489034603

當一個請求被HTTP監聽者(HTTP.sys)接受之後,它根據請求的URL進行匹配,然後馬上就把請求放在一個內核模式的不同的隊列中,以便這些請求可以被用戶模式中的應用程序池中工作進程獲取,然後處理。這裡之所以要把請求放在隊列中是為了快速的釋放HTTP監聽線程,從而使得HTTP.sys可以接受其他更多的請求。另外,請求被放在不同的隊列,主要是根據請求的URL來分組的,並且應用程序池中也配置了處理何種URL。

當響應產生之後,響應會被再次發送給HTTP.sys(大家可以看到圖中第5個步驟),然後再把響應發送給客戶端。HTTP.sys可以基於一些配置將響應進行緩存,我們會在後面進一步的討論。

這裡有一點非常中的就是:HTTP.sys將響應緩存在內核中,並且這個內核中的這個緩存空間是不分頁的。

不分頁就意味著HTTP.sys總是將響應的內容緩存物理的內存中,而且這一塊內存不會被交換出去,就是說不會被分頁到磁盤上面。這涉及到了Windows操作系統的內存管理機制,大家自學去吧,呵呵。

當請求的響應被緩存在了內核模式之後,下次再次請求的時候,可以直接的讀取緩存,而後續的步驟全部跳過,這會極大的提升性能。

注:今天先到這裡,未完待續,還有應用層的緩存,以及如何設計比較智能的緩存。如果小夥伴想要學習大數據架構師的技術,可以加下圖片下面的交流群,群裡有很多學習視頻都可以下載,而且每天大數據架構師馬士兵老師都會在群裡分享大數據的技術。。

相關推薦

推薦中...