由於近幾年來Web 2.0網站與社群網站盛行,於是開始出現採用如NoSQL資料庫解決網站的資料流量急速增漲的問題,並且NoSQL資料庫具備水平擴充能力,只要增加新的伺服器節點,就能夠不斷擴充資料庫的容量。

曾義峰認為,像Redis這種記憶體式資料庫,主要的功能除了提供快取外,還可額外提供運算處理,所以非常適合輔助關聯式資料庫。以他實際的應用方式,全部資料還是放在資料庫,真正需要加快速度的資料或額外特別的處理時,也會放一份在 Redis 處理。

回顧Redis發展,直到最近才釋出的3.0版,加入了使用者期待已久的叢集(Cluster)功能,讓Redis進入另一個開發階段。因此,在官方還沒有叢集模組之前,就有第三方的外掛產品,例如Twitter自行開發的Twemproxy、以及中國廠商推出的Codis、Cerberus等解決相關需求。

較於同為NoSQL記憶體資料庫的Memcached,Redis 通常只會使用處理器的單一執行緒,若真的想要利用多核處理器,曾義峰建議,在建置上可以採多個 Redis 實例(Instance),以充分應用CPU硬體資源,但設定及操作上有許多需要注意之處,效果有好有壞。Redis使用jemalloc及tcmalloc模式降低記憶體碎片化的情況,而不採用Free-list或其他方法,是為了維持其簡單、單純、較有效率的設計原則,相較之下,Memcached採用預先分配的方式,雖然較能有效降低記憶體碎片化問題,卻會帶來浪費空間的情況。

Redis雖然只支援單一處理器單一執行緒,然而還是有變通的方法可以充分使用硬體效能,就是同時執行多個Redis程式。曾義峰表示,實務上一個Redis,通常還要再保留一個執行緒給它的外掛使用,故雖然最多可以執行與處理器執行緒同樣的數量,仍建議最大開啟Redis的數量為執行緒的一半。

而Redis的長處,在於提供豐富的資料型態操作,例如Hashs、Lists、Sets、Sorted Sets、HyperLogLog等,並內建複寫(replication)與叢集功能,以及能夠直接就地更新作業的特性。

Memcached與Redis有許多的架構上的差異,例如Memcached支援多個處理器核心和執行緖,較能充分利用現代處理器的效能,並且採用預先分配的記憶體池零碎空間,減少記憶碎片,而使得實際的記憶體使用量較Redis要少,以及記憶體分配壓力也同時減少。

Memcached支援處理器的多執行緒,因此較能善用現代處理器多核心與多執行緒的效能。這件事情因為Redis只會使用單一執行緒的資源,變成了優點。

以曾義峰自身的使用經驗,Redis與Memcached各有其長處,以數據量做分界,在10KB以下,或是10MB以上,Redis的效能比Memcached的表現來得要好。

但是,基於Memcached沒有像Redis提供的硬碟持久化機制,無法防止雪崩效應(Thundering herd),因此曾義峰在業務場景有此需要時,會建議捨棄 Memcached 轉用 Redis。

他也拿Redis與另一套新興的記憶體資料庫軟體AeroSpike相較,AeroSpike雖然針對多核心處理器最佳化,並且同時能夠使用記憶體與固態硬碟為資料庫的存放空間等優點,然而,目前卻有容易資料丟失,以及有時候服務中斷的情況。

新興的記憶體式資料庫AeroSpike,相較於Redis而言,除了完全針對現在的軟硬體設計,並可避免圖中Redis再次寫入AOF文件時,效能會突然降低(綠色線波谷處)的「效能抖動」情況。

現行的 Redis 在處理 Session 場景下並非相當適合。例如經由演算法抽樣,刪除舊數據,卻有可能因為抽樣出來的是很新的數據,使得使用者提前被登出,而且,網站管理員必須透過使用者的回報,才會知道這個情況。曾義峰提出了相當多的Redis使用與設定技巧,我們覺得他所提出的技巧,對於計畫要採用Redis的網頁工程師會相當有幫助,例如他提到在建置時裝在那一套Linux系統上會比較好,如果改以VM建置,也會影響效能,還有假如Redis的記憶體設定值太高,有可能演變成記憶體使用量超過實體記憶體,造成作業系統強制關掉Redis的情況,而這些設定細節在上線的網站中,都需要特別留意。

雖然曾義峰分析Memcached與AeroSpike有嚴重的缺點,因此,他本次主要與我們分享Redis的使用技巧,但他也表示,沒有最好的記憶體資料庫軟體,只有適合自己的,事實上有些情況他也會採用Memcached或AeroSpike,最好以自家網頁加速需求,決定存放資料庫的容器,再選擇使用的記憶體資料庫軟體。


Advertisement

更多 iThome相關內容