走進快取的世界(一) 開篇

2021-09-07 06:56:31 字數 2352 閱讀 3025

對於程式設計師來說多多少少都懂一點演算法,演算法是什麼?演算法是「時間」與「空間」的互換策略。

我們常常研究乙個演算法的時間複雜度和空間複雜度,如果我們有絕對足夠的時間和空間,那麼演算法就不需要了,可惜這種條件是不存在的,只是在某些情況下我們會協調兩者從而達到效能上的平衡。

快取是一種「用空間換時間」的策略,通俗的講,快取就是把一些資料暫時儲存起來,避免了某些重複的耗時操作,減少時間開銷的一種方法。

商業世界中常說的一句話是「現金為王」。在技術世界裡,與之相近的乙個說法是「快取為王」。

從底層到上層主要涉及:資料庫模型設計,sql優化,使用快取等。從圖中的優化模式來看,其中資料庫模型設計的合理程度奠定了應用系統優化的基石,如果模型設計得不合理,隨著業務發展,後續的優化將會變得很困難。另一方sql優化也是資料庫優化的乙個重要方面,慢sql和top sql往往是系統效能殺手,它們是導致系統故障的重要潛在危險。

快取在構建高效能伺服器中有著舉足輕重的作用,很多時候sql優化, 演算法優化所帶來的效果可能遠遠不如快取帶來的優化效果。但是快取的使用並不是零成本的,任何快取的增加,都會帶來兩大問題:

如何解決呢?首先考慮去掉快取。不要為了快取而快取,快取不必要時,應該果斷去掉,從而降低系統出錯的可能性和系統複雜度。有些對資料實時性,準確性要求極高的系統,不能使用快取。其次是分析需求,不同的業務會有不同的快取策略,仔細分析變化與不變的資料,將不變的資料長時間快取,變化的資料根據資料的業務要求動態調整快取時間和儲存方式。最後就是增加開發人員自身的能力,後面會詳細提及各種問題的處理方法。

什麼樣的員工是好員工?最直接最本質的回答:能辦事、且辦事靠譜就是好員工,答案並不是聰明、勤奮、社交好等等,這些只是成為乙個靠譜員工的充要條件。

什麼樣的快取才是好快取呢?答案是:命中率高的快取。

在解決問題前提下,命中率高的快取比命中率低的快取,在硬體投入上一般會小很多,快取數量比命中率低的快取數量也少很多,定址速度肯定也比較快,所以命中率高的快取是好快取。

快取的設計需要考慮快取的占用空間和命中率。我們當然希望快取占用空間小,命中率高。命中率高是快取設計的重要考察因素, 是提高系統效能的關鍵。占用空間越小,需要的成本越低。低成本,高效能的快取設計是我們追求的目標。這沒有固定的設計方法和公式,需要根據不同的業務靈活調整,但是,關於快取在業務開發中的設計方法,有一些比較常用的思路與模式,借鑑這些模式,我們可以復用或創新,解決新的業務中所出現的問題。

乙個實體丟到快取中後,在被快取期間,如果一次都沒有使用過,這個快取實體的命中率就是0。這個實體被請求的次數越多,快取命中率越高。

上面說的是快取中乙個實體的命中率。對於快取整體來說,命中率=命中數/總查詢數。

對於快取來說:通常最常使用的個體佔總體的很小一部分,最不常使用的佔整體的很大一部分.。

所以我們經常會看到類似這樣的資料:

快取的1萬個元素中,有100個被頻繁的使用,幾乎每分鐘都會被使用一次。2000個資料,每小時被請求一次。3000個資料,每天被請求一次,剩下的資料,被丟到快取中後一次都沒有被使用過。

現在硬體發展很快,如果我們只是需要快取1萬個資料的話,我們完全可以做到不管這1萬個資料是否被使用到,全部丟到快取,這樣只要找資料,肯定快取中有這個資料。而不需要作額外的運算,或者不需要向資料庫發出請求。

但是:硬體發展快,資料量發展也快。小型的**,快取1萬條資料,也就全部快取了。但是大型**最少也是上百萬的資料量或者上t級別的資料,這些資料量顯然不能都丟到快取。這時候設計乙個合理的快取方案,提高快取的命中率,就非常重要而且是必須的。

純技術的角度來說,我們只有記錄了使用者單位時間的請求數,並依照它來把最常使用的資料快取起來,從而提高快取命中率。

我們應該通過上面邏輯,根據我們實際業務邏輯,提供乙個快取演算法,提高快取的命中率。讓在我們硬體允許的條件下,快取適當的資料,而不是所有資料。

要知道,現在爬蟲程式很多的。另外,部落格這類搜尋引擎友好的站點,絕大多數訪問壓力是搜尋引擎匯入的。而這些訪問一般都是1小時,或者1天之內,對某篇文章只有幾次甚至1次請求,之後再也沒有了,這種快取方法,命中率會非常低。

說了這麼多快取命中率的問題,簡單彙總一下快取命中率的觀點:

快取是臨時的儲存,所以快取的生命週期是有限的。它依次可能會經歷如下活動:

最常見的幾種過期策略如下:

多長時間沒有被請求,則過期,最典型的就是asp的section 功能。

依賴於檔案變更的快取,一旦檔案被修改,則過期,典型的是web站點的web.config,一旦這個檔案變更,不但快取重起,iis程序也會進行一次釋放工作。

在此基礎上,引申出很多依賴關係的快取過期策略,比如依賴於資料庫的快取過期策略。

當然,業務邏輯裡可能會有更複雜的過期策略,比如csdn新版積分制論壇中,帖子列表快取會在列表資料快取達到600時,把它清理到550條資料。

走進快取的世界(一) 開篇

系列文章 對於程式設計師來說多多少少都懂一點演算法,演算法是什麼?演算法是 時間 與 空間 的互換策略。我們常常研究乙個演算法的時間複雜度和空間複雜度,如果我們有絕對足夠的時間和空間,那麼演算法就不需要了,可惜這種條件是不存在的,只是在某些情況下我們會協調兩者從而達到效能上的平衡。快取是一種 用空間...

走進快取的世界(一) 開篇

對於程式設計師來說多多少少都懂一點演算法,演算法是什麼?演算法是 時間 與 空間 的互換策略。我們常常研究乙個演算法的時間複雜度和空間複雜度,如果我們有絕對足夠的時間和空間,那麼演算法就不需要了,可惜這種條件是不存在的,只是在某些情況下我們會協調兩者從而達到效能上的平衡。快取是一種 用空間換時間 的...

走進快取的世界(二) 快取設計

主要考慮三個問題 系統優化時有一句話必須切記 優化無止境 所以如果快取不是必須的,請果斷去掉,要知道越是業務上覆雜的系統,對cache的使用反而越簡單,因為對於乙個複雜 多變 歷史悠久的系統,在cache方面做過度設計會讓人深陷其中 快取的資料越多,系統的維護成本就越高,所以找準需要快取的點尤為重要...