平時進行服務端軟件開發的時候,咱們一般會把數據存儲在數據庫裏。而服務端系統遇到的第一個性能瓶頸,每每就發生在訪問數據庫的時候。數據庫
這個時候,大部分工程師和架構師會拿出一種叫做「緩存」的武器,經過使用Redis或者Memcache這樣的開源軟件,在數據庫前面提供一層緩存的數據,緩存
來緩解數據庫面臨的壓力,提高服務端的程序性能。
性能優化
在數據庫前添加數據緩存是常見的性能優化方式服務器
那麼,不知道你有沒有想過,這種添加緩存的策略必定是有效的嗎?或者說,這種策略在什麼狀況下是有效的呢?若是從理論角度去分析,數據結構
添加緩存必定是咱們的最佳策略麼?進一步地,若是咱們對於訪問性能的要求很是高,但願數據在1毫秒,乃至100微妙內完成處理,咱們還能用這個添加緩存的策略麼?
架構
能夠看到,不一樣的存儲器設備之間,訪問速度、價格和容量都有幾十乃至上千倍的差別。性能
同一份數據在短期內會反覆屢次被訪問優化
相鄰的數據會被連續訪問網站
固然,這裏咱們只是一個簡單的估算。在實際的應用程序中,查看一個商品的數據可能意味着不止一次的隨機內存或者隨機磁盤的訪問。對應的數據存儲空間也不止要考慮數據,spa
還須要考慮維護數據結構的空間,而緩存的命中率和訪問請求也要考慮均值和峯值的問題。
經過這個估算過程,你須要理解,如何進行存儲器的硬件規劃。你須要考慮硬件的成本、訪問的數據量以及訪問的數據分佈,而後根據這些數據的估算,來組合不一樣的存儲器,
能用盡量低的成本支撐所須要的服務器壓力。而當你用上了數據訪問的局部性原理,組合起了多種存儲器,你也就理解了怎麼基於存儲器層次結構,來進行硬件規劃了。
這一講,咱們講解了計算機存儲器層次結構中最重要的一個優化思路,就是局部性原理。
在實際的計算機平常的開發和應用中,咱們對於數據的訪問老是會存在必定的局部性。有時候,這個局部性是時間局部性,就是咱們最近訪問過的數據還會被反覆訪問。
有時候,這個局部性是空間局部性,就是咱們而局部性的存在,使得咱們能夠在應用開發中使用緩存這個有利的武器。好比,經過將熱點數據加載並保留在速度更快的存儲設備裏面,
在速度更快的存儲設備裏面,咱們能夠用更低的成原本支撐服務器。
經過亞馬遜這個例子,咱們能夠看到,咱們能夠經過快速估算的方式,來判斷這個添加緩存的策略是否可以知足咱們的需求,以及在估算的服務器負載的狀況下,
須要規劃多少硬件設備。這個「估算+規劃」的能力,是每個指望成長爲架構師的工程師,必須掌握的能力。
最後,回到這一講的開頭,我問了你這樣一個問題,在遇到性能問題,特別是訪問存儲器的性能問題的時候,是否能夠簡單地添加一層數據緩存就能讓問題迎刃而解呢?
今天這個亞馬遜網站商品數據的例子,彷佛給了咱們一個「Yes」的答案。那麼,這個答案是否放之四海皆準呢?後面的幾講,咱們會深刻各類應用場景,進一步來回答這個問題。