希幔科技總工程師曾義峰認為, Redis具備防止雪崩效應機制且不會遺失資料,比起Memcached與AeroSpike是較好的記憶體資料庫。

圖片來源: 

iThome

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

而Redis是近年來出現NoSQL開源資料庫的一種,並且將資料存放在記憶體中,以提升讀取的效率。對於架設古典音樂串流網站Muzik Online的希幔科技而言,旗下網站需要應付大量的流量,採用Redis做分散式快取服務有其必要性,希幔科技總工程師曾義峰在Modern Web 2015大會中,分享使用Redis的實戰經驗。

Redis非關聯式資料庫替代品

曾義峰認為,像Redis這種記憶體式資料庫,主要的功能還是提供快取,而非完整的正規SQL關聯式資料庫替代品。以他實際的應用方式,全部資料還是放在MySQL,真正需要加快速度的資料,才會放一份在Redis裡面。

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

相較於同為NoSQL記憶體資料庫的Memcached,Redis只會使用處理器的單一執行緒,因此,曾義峰建議,在建置上可以採多個Redis實例(Instance),以充分硬體資源。Redis使用jemalloc及tcmalloc模式降低記憶體碎片化的情況,而不採用Free-list或其他方法,是為了維持其簡單、單純、較有效率的設計原則,相較之下,Memcached採用預先分配的方式,較能有效降低記憶體碎片化問題,卻導致空間浪費的情況。

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

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

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

但是,基於Memcached沒有像Redis提供的硬碟持久化機制,無法防止雪崩效應(Thundering herd),因此曾義峰最後還是捨棄了Memcached。

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

現行的Redis還不是相當的完美,例如經由演算法抽樣,刪除舊數據,卻有可能因為抽樣出來的是很新的數據,使得使用者提前被登出,而且,網站管理員必須透過使用者的回報,才會知道這個情況。曾義峰提出的Redis使用與設定技巧,對於計畫採用Redis的工程師相當有幫助。

雖然曾義峰因為Memcached與AeroSpike部分場景下有不能接受的缺點,因此他的選擇是Redis,但他也表示,沒有最好的記憶體資料庫軟體,只有適合自己的,最好以自家網頁加速需求,決定存放資料庫的容器,再選擇使用的記憶體資料庫軟體。


Advertisement

更多 iThome相關內容