伺服器快取策略簡介一二

2021-09-29 04:34:25 字數 2121 閱讀 8512

我們提到伺服器端效能問題的時候,往往會混淆不清。因為當我們訪問乙個伺服器時,出現服務卡住的時候,就會認為是「效能問題」。但是實際上這個效能問題可能是有不同的原因,表現出來都是針對客戶請求的延遲很長甚至中斷。

我們先來看看這些原因有哪些:第乙個是所謂併發數不足,也就是同時請求的客戶過多,導致超過容納能力的客戶被拒絕服務,這種情況往往會因為伺服器記憶體耗盡而導致的;第二個是處理延遲過長,也就是有一些客戶的請求處理時間已經超過使用者可以忍受的長度,這種情況常常表現為cpu占用滿額100%。

我們在伺服器開發的時候,最常用到的有下面這幾種硬體:cpu、記憶體、磁碟、網絡卡。其中cpu是代表計算機處理時間的,硬碟的空間一般很大,主要是讀寫磁碟會帶來比較大的處理延遲,而記憶體、網絡卡則是受儲存、頻寬的容量限制的。所以當我們的伺服器出現效能問題的時候,就是這幾個硬體某乙個甚至幾個都出現負荷佔滿的情況。

這四個硬體的資源一般可以抽象成兩類:一類是時間資源,比如cpu和磁碟讀寫;一類是空間資源,比如記憶體和網絡卡頻寬。所以當我們的伺服器出現效能問題,有乙個最基本的思路,就是——時間空間轉換。

我們可以舉幾個例子來說明這個問題。

當我們訪問乙個web的**的時候,輸入的url位址會被伺服器變成對磁碟上某個檔案的讀取。如果有大量的使用者訪問這個**,每次的請求都會造成對磁碟的讀操作,可能會讓磁碟不堪重負,導致無法即時讀取到檔案內容。但是如果我們寫的程式,會把讀取過一次的檔案內容,長時間的儲存在記憶體中,當有另外乙個對同樣檔案的讀取時,就直接從記憶體中把資料返回給客戶端,就無需去讓磁碟讀取了。由於使用者訪問的檔案往往很集中,所以大量的請求可能都能從記憶體中找到儲存的副本,這樣就能大大提高伺服器能承載的訪問量了。這種做法,就是用記憶體的空間,換取了磁碟的讀寫時間,屬於用空間換時間的策略。

舉另外乙個例子:我們寫乙個網路遊戲的伺服器端程式,通過讀寫資料庫來提供玩家資料存檔。如果有大量玩家進入這個伺服器,必定有很多玩家的資料資料變化,比如公升級、獲得**等等,這些通過讀寫資料庫來實現的操作,可能會讓資料庫程序負荷過重,導致玩家無法即時完成遊戲操作。我們會發現遊戲中的讀操作,大部分都是針是對一些靜態資料的,比如遊戲中的關卡資料、**道具的具體資訊;而很多寫操作,實際上是會覆蓋的,比如我的經驗值,可能每打乙個怪都會增加幾十點,但是最後記錄的只是最終的乙個經驗值,而不會記錄下打怪的每個過程。所以我們也可以使用時空轉換的策略來提供效能:我們可以用記憶體,把那些遊戲中的靜態資料,都一次性讀取並儲存起來,這樣每次讀這些資料,都和資料庫無關了;而玩家的資料資料,則不是每次變化都去寫資料庫,而是先在記憶體中保持乙個玩家資料的副本,所有的寫操作都先去寫記憶體中的結構,然後定期再由伺服器主動寫回到資料庫中,這樣可以把多次的寫資料庫操作變成一次寫操作,也能節省很多寫資料庫的消耗。這種做法也是用空間換時間的策略。

最後說說用時間換空間的例子:假設我們要開發乙個企業通訊錄的資料儲存系統,客戶要求我們能儲存下通訊錄的每次新增、修改、刪除操作,也就是這個資料的所有變更歷史,以便可以讓資料回退到任何乙個過去的時間點。那麼我們最簡單的做法,就是這個資料在任何變化的時候,都拷貝乙份副本。但是這樣會非常的浪費磁碟空間,因為這個資料本身變化的部分可能只有很小一部分,但是要拷貝的副本可能很大。這種情況下,我們就可以在每次資料變化的時候,都記下一條記錄,內容就是資料變化的情況:插入了一條內容是某某的聯絡方法、刪除了一條某某的聯絡方法……,這樣我們記錄的資料,僅僅就是變化的部分,而不需要拷貝很多份副本。當我們需要恢復到任何乙個時間點的時候,只需要按這些記錄依次對資料修改一遍,直到指定的時間點的記錄即可。這個恢復的時間可能會有點長,但是卻可以大大節省儲存空間。這就是用cpu的時間來換磁碟的儲存空間的策略。我們現在常見的mysql innodb日誌型資料表,以及svn源**儲存,都是使用這種策略的。

快取的本質,除了讓「已經處理過的資料,不需要重複處理」以外,還有「以快速的資料儲存讀寫,代替較慢速的儲存讀寫」的策略。我們在選擇快取策略進行時空轉換的時候,必須明確我們要轉換的時間和空間是否合理,是否能達到效果。

需要注意的是,快取的資料和我們程式真正要操作的資料,往往是需要進行一些拷貝和運算的,這就是序列化和反序列化的過程。這個過程很快,也有可能很慢。所以我們在選擇資料快取結構的時候,必須要注意其轉換時間,否則你快取的效果可能被這些資料拷貝、轉換消耗去很多,嚴重的甚至比不快取更差。一般來說,快取的資料越解決使用時的記憶體結構,其轉換速度就越快,在這點上,protocol buffer採用tlv編碼,就比不上直接memcpy的乙個c結構體,但是比編碼成純文字的xml或者json要來的更快。因為編譯碼的過程往往要進行複雜的查表對映,列表結構等操作。

伺服器快取

快取可以在客戶端和伺服器中做,要是之間還有 也可能對響應進行快取。是將客戶端和伺服器連線在一起,作為中間人角色,可以將客戶端請求響應的內容進行快取,在下次客戶端快取時,直接返回快取結果,提高效能。快取控制是在http頭資訊中cache control設定,當設成private時,不會進行快取,當設定...

快取伺服器

nosql nosql not only sql 意即 不僅僅是sql 泛指非關係型的資料庫,隨著網際網路web2.0 的興起,傳統的關聯式資料庫在應付web2.0 特別是超大規模和高併發的sns型別的web2.0純動態 已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特...

伺服器簡介

常用伺服器型別介紹 1 機架式伺服器 伺服器外形並不像常規的計算機,而是與交換機相似,有1u,2u,4u不同的規格 1u約等於4.45cm 2 塔式伺服器 伺服器的外觀與平常使用的立式計算機相似,伺服器的主機板擴充套件性比較好 插槽較多,體積也比較標準的atx機箱大。3.刀片式伺服器 刀片式伺服器是...