1. 程式人生 > >深入解讀快取(一)——快取的力量

深入解讀快取(一)——快取的力量

應用伺服器的效能優化,是網站開發最複雜,變化最多的地方。優化的手段,主要有:快取、叢集、非同步等等。從今天起,我們就來講講快取。

首先,我們來看幾個例子:

1、淘寶賣家瀏覽的商品集中在少部分 成交數多、評價良好的商品上;

2、百度搜索關鍵詞集中在少部分熱門詞彙上;

3、只有經常登入的使用者才會發微博、看微博,而這部分使用者也只佔總使用者數目的一小部分。

快取的基本原理

像上面的幾種情況,就非常適合我們使用快取。

網站的訪問特點與現實世界的財富分配一樣,遵循二八定律:80%的業務訪問集中在20%的資料上。

既然大部分業務訪問集中在一小部分資料上,那麼如果把這一小部分資料快取在記憶體中,就可以減少資料庫的訪問壓力,提高整個網站的資料訪問速度。

快取主要用來存放讀寫比很高、很少變化的資料。如商品的類別資訊、熱門詞的搜尋列表資訊、熱門商品資訊等等。


應用程式讀取資料時,先到快取中讀取,如果取不到或者資料已失效,再訪問資料庫,並將說幾句寫入快取。

快取,是指將資料儲存在相對較高訪問速度的儲存介質中,以供系統處理。

一方面快取訪問速度快,可以減少資料訪問的時間,另一方面如果快取的資料是經過計算處理得到的,那麼被快取的資料無需重複計算即可直接得到,因此快取還起到了減少計算時間的作用。

快取的分類

我們應該都寫過這樣的程式,在一個類中,我們宣告一個靜態的map,每次取值時,都是根據key去map裡拿值,如果沒有我們再去資料庫裡讀取,然後將讀上來的資料放在map裡面,以供下次使用。

上面講的這個小程式,其實就是快取的基本原理。快取,在java中無處不在。每一箇中間件中,幾乎都有快取:hibernate、mybatis中的一級快取、二級快取以及查詢快取,Spring、struts原始碼中都有快取。下面我們就對這些快取進行一個分類。

1、CDN

2、反向代理

3、本地快取

4、分散式快取

1、CDN

首先,我們來介紹一下CDN。

CDN,全稱是Content Delivery Network,內容分發網路,它的作用是:將資料部署在距離使用者最近的網路服務商,使用者的網路請求總是先打達他的網路服務商,在這裡快取網站的一些靜態資源,就可以就近以最快的速度返回給使用者。靜態資源,如圖片、檔案、css、script指令碼、靜態網頁等等。


我們都可以直接租用電信、移動、聯通等的機房,將靜態資源放在租用的機房裡面,提高訪問速度。

2、反向代理

反向代理,屬於前端架構的一部分。用於請求,最先訪問到的就是反向代理伺服器,這裡快取網站的靜態資源,無需將請求繼續轉發給應用伺服器,就能直接返給使用者。

當動態內容有變化時,通知內部通知機制,通知反向代理快取失效。反向代理會重新載入最新的動態內容再次快取起來。


一般,中小型網站使用的nginx,就能起到反向代理的作用。

3、本地快取

本地快取,應用伺服器本地快取著的熱點資料。本地快取的好處就是應用程式可以直接訪問記憶體中的資料,而無需訪問資料庫。這種快取,就像我在上面舉的那個map的例子。應用伺服器直接從本機上讀取資料,不用走網路和IO,所以這種訪問速度會非常快。而它的缺點就是:會出現快取與應用伺服器爭用記憶體的情況,記憶體的大小,會成為系統的瓶頸。

4、分散式快取

通過分散式快取伺服器叢集,將快取資料分佈到叢集、多臺伺服器上,可在一定程度上改善快取的可用性。當一臺快取伺服器宕機時,只有部分快取資料丟失,重新從資料庫載入這部分資料,不會對資料庫產生很大的影響,真正起到分攤資料庫壓力的作用。


分散式快取伺服器的叢集,與應用伺服器叢集不同。應用伺服器叢集是在所有伺服器上部署相同的應用,起到分攤應用伺服器訪問壓力的作用。

而分散式快取伺服器叢集中,不同的伺服器中快取的資料各不相同,快取訪問請求不可以在快取伺服器叢集中的任意一臺處理,必須先找到快取有需要資料的伺服器,然後才能訪問。

應用

其實,快取的技術使用,是很簡單的。只要有一定SQL基礎的童鞋,使用快取上手很快的。

然後,快取的應用難點在於:需要程式設計師去辨別什麼時候,使用快取。下面,我準備了幾個例子,供大家參考:

例子一:新浪的快取架構

由於微博頻繁重新整理,新浪微博使用多級快取策略,熱門微博和明星使用者的微博,快取在所有微博的伺服器上(即本地快取),實現高速訪問;線上使用者的微博和近期微博快取在分散式快取叢集中,分攤資料庫的訪問壓力。微博中常見的刷微博操作,幾乎全是快取訪問操作。

例子二:維基百科後臺效能優化

熱點特別集中的資料,直接快取到應用伺服器的本地快取中,多臺應用伺服器重複快取、資料量小、讀取頻率高;快取資料內容,儘量使應用伺服器可直接使用的格式,如HTML格式,減少應用伺服器從快取獲取資料後,解析構造資料的代價;使用分散式快取伺服器叢集儲存session物件。

例子三:我們公司的快取應用

使用分散式快取Memcache叢集,儲存session物件。簡訊驗證碼、產品詳情、訂單詳情等都儲存在分散式快取中。

將一些結構不規則,展示性的資訊,儲存在Mongodb中;將定時任務,一些庫存操作的事件資訊、快照,儲存在Mongodb中。

本篇文章,介紹了快取的相關知識,下篇我們繼續來深入介紹一下分散式快取。