當前主流記憶體數據庫功能特性和效能比較分析

2020-08-10 12:02:33

轉載自品略圖書館 http://www.pinlue.com/article/2018/09/1505/067175035845.html

 

記憶體數據庫從範型上可以分爲關係型記憶體數據庫和鍵值型記憶體數據庫。在實際應用中記憶體數據庫主要是配合oracle或mysql等大型關係數據庫使用,關注效能,作用類似於快取,並不注重數據完整性和數據一致性。基於鍵值型的記憶體數據庫比關係型更加易於使用,效能和可延伸性更好,因此在應用上比關係型的記憶體數據庫使用更多。本文首先比較FastDB、Memcached和Redis主流記憶體數據庫的功能特性,再從效能上比較H2、Memcached和Redis三種記憶體數據庫,希望大家能夠根據自己業務需求的具體特點,選擇合適的開源產品。

主流記憶體數據庫功能比較

FastDB

FastDb是高效的關係型記憶體數據庫系統,具備實時能力及便利的C++介面。FastDB針對應用程式通過控制讀存取模式作了優化。通過降低數據傳輸的開銷和非常有效的鎖機制 機製提供了高速的查詢。對每一個使用數據庫的應用數據庫檔案被影射到虛擬記憶體空間中。因此查詢在應用的上下文中執行而不需要切換上下文以及數據傳輸。fastdb中併發存取數據庫的同步機制 機製通過原子指令實現,幾乎不增加查詢的開銷。

FastDB的特點包括如下方面:

1、FastDB不支援client-server架構因而所有使用FastDB的應用程式必須執行在同一主機上;

2、fastdb假定整個數據庫存在於RAM中,並且依據這個假定優化了查詢演算法和介面。

3、fastdb沒有數據庫緩衝管理開銷,不需要在數據庫檔案和緩衝池之間傳輸數據。

4、整個fastdb的搜尋演算法和結構是建立在假定所有的數據都存在於記憶體中的,因此數據換出的效率不會很高。

5、Fastdb支援事務、線上備份以及系統崩潰後的自動恢復。

6、fastdb是一個面嚮應用的數據庫,數據庫表通過應用程式的類資訊來構造。

FastDB不能支援Java API介面,這使得在本應用下不適合使用FastDB。

Memcached

Memcached是一種基於Key-Value開源快取伺服器系統,主要用做數據庫的數據高速緩衝,並不能完全稱爲數據庫。

memcached的API使用三十二位元的回圈冗餘校驗(CRC-32)計算鍵值後,將資料分散在不同的機器上。當表格滿了以後,接下來新增的資料會以LRU機制 機製替換掉。由於    memcached通常只是當作快取系統使用,所以使用memcached的應用程式在寫回較慢的系統時(像是後端的數據庫)需要額外的程式更新memcached內的資料。

memcached具有多種語言的用戶端開發包,包括:Perl、PHP、JAVA、C、Python、Ruby、C#。

Redis

Redis是一個高效能的key-value數據庫。redis的出現,很大程度補償了memcached這類keyvalue儲存的不足,在部分場合可以對關係數據庫起到很好的補充作用。它提供了C++、Java、Python,Ruby,Erlang,PHP用戶端。

小結

由於不支援Java用戶端,因此FastDB並不合適。在Memcached和Redis的比較上,分爲效能和功能兩個方面。

關於效能方面的詳細內容建議繼續閱讀後面的內容,我對H2、Memcached和Redis親自從讀寫刪三方面進行了效能測試。

因此從記憶體數據庫功能特性方面綜合來看,推薦使用Redis。

主流記憶體數據庫效能比較

測試目的

本次效能測試選擇目前成熟度和使用度都比較高的記憶體數據庫,通過讀寫的效能測試比較這些主流數據庫中的效能優劣。在效能測試過程中同時記錄各個產品的穩定性。

比較的記憶體數據庫包括Memcached、Redis、H2。

測試方法

效能測試主要包括對記憶體數據庫讀、寫、刪除的測試。

使用單個執行緒將一定量的記錄插入記憶體數據庫,記錄插入時間,每條記錄的數據大小相同;然後在進行一定量的讀操作,記錄讀出時間;最後將這些數據刪除,記錄時間。

根據讀寫效率綜合評估記憶體數據庫效能。

具體的測試數據量爲:

1、插入10000條數據,記錄時間;

2、讀取上述10000條數據,記錄時間;

3、將上述10000條數據逐條刪除,記錄時間。

測試環境

本次測試共需要使用一臺聯繫伺服器,設定如下:

CPU:Intel(R) Xeon(R) CPU E7-4830 @ 2.13GHz,共32個CPU,每個CPU8核;

記憶體:實體記憶體8G,交換分割區9G;

磁碟:物理磁碟250G;

網絡卡:單網絡卡,頻寬上限1000Mbps,全雙工

在該伺服器上搭建中標雲平臺,並建立虛擬機器,三種記憶體數據庫均部署在該虛擬機器中,虛擬機器設定爲:

CPU:Intel(R) Xeon(R) CPU E7-4830 @ 2.13GHz,共2個CPU,每個CPU8核;

記憶體:實體記憶體1G,交換分割區5G;

磁碟:物理磁碟50G;

網絡卡:單網絡卡,頻寬上限1000Mbps,全雙工

測試應用部署在一臺普通臺式機中,臺式機設定爲:

CPU:Intel(R) Xeon(R) CPU E7-4830 @ 2.13GHz,共2個CPU,每個CPU2核;

記憶體:實體記憶體1G,交換分割區2G;

磁碟:物理磁碟64G;

網絡卡:單網絡卡,頻寬上限1000Mbps(共用),全雙工

臺式機和伺服器採用普通內部區域網連線。

記憶體數據庫部署

Memcached

Memcached的安裝前先安裝依賴的libevent庫,步驟如下:

# tar -zxvf libevent-2.0.12.stable.tar.gz

# cd libevent-2.0.12.stable

# ./configure –prefix=/usr/libevent

# make

# make install

安裝的memcached需要從原始碼編譯安裝,步驟如下:

# tar -zxvf memcached-1.4.15.tar.gz

# cd ./memcached-1.4.15

# ./configure –with-libevent=/usr/libevent

# make

# make install

Redis

Redis的安裝也是從原始碼開始,將Redis原始碼壓縮包拷貝到/usr/local/目錄下,安裝步驟如下:

# tar -zxvf redis-2.6.14.tar.gz

# cd ./redis-2.6.14

# make

開啓Redis伺服器和Redis自帶的用戶端存取工具如下:

# src/redis-server

# src/redis-cli

H2

H2的安裝較爲簡單,直接使用unzip命令進行解壓即可。

解壓之後進入bin目錄,並修改h2.sh檔案中的Java命令啓動的主類和選項爲:

org.h2.tools.Server -tcpAllowOthers -webAllowOthers

然後執行指令碼h2.sh即可啓動數據庫。H2提供本地命令列控制檯,啓動方式爲:

# java -cp *.jar org.h2.tools.Shell

一般來說,使用圖形化的Web介面更爲方便。

測試結果

Memcached的測試結果如下:

Benchmark result has listed as follow:

Set Data spent time (ms): 344

Get Data spent time (ms): 8297

Delete Data spent time (ms): 187

Redis的測試結果如下:

Benchmark result has listed as follow:

Set Data spent time (ms): 5594

Get Data spent time (ms): 6312

Delete Data spent time (ms): 3969

H2的測試結果如下:

Benchmark result has listed as follow:

Set Data spent time (ms): 14609

Get Data spent time (ms): 14859

Delete Data spent time (ms): 10469

結果分析

從結果來看,Memcached的效能最好,Redis其次,而H2的效能則最差。細節方面,Redis的讀效能要略好於Memcached。

在執行本次測試之前並沒有對各個軟體進行優化,因爲測試數據總量10000條,每條不到1KB,總共不過10MB,而且單個執行緒,所以預設設定應該都是足夠的,因此測試結果能夠反映各自的效能情況。

產生這個結果的原因主要是三種軟體的功能豐富程度不同,以及使用記憶體的情況不同。H2作爲關係型數據庫,具有持久儲存功能,因此還是大量使用了磁碟,而且H2也要考慮數據完整性和原子性等關係數據庫的關鍵特性;而Redis採用Key-Value範型,不能達到關係型數據庫那樣的可靠性,實現的特性少,可以更加關注效能,但是爲了防止數據丟失,支援持久儲存機制 機製;而同樣是Key-Value方式的Memcached則不支援持久儲存,純記憶體軟體。

還有一項與效能無關的情況需要指出,在編寫測試應用的時候,Memcached操作的程式碼量最少,其次爲Redis,H2所需程式碼最多。

結論

綜合上述功能特性的分析和效能測試結果分析,對於記憶體數據庫的選型結論如下:

1、如果無特殊要求,則Memcached綜合效能最好,程式設計最方便,推薦使用;

2、如果讀操作很多,而且需要記憶體數據庫提供持久儲存以避免重新啓動之後數據丟失,則推薦使用Redis。

在效能方面,可以參考資料[6]中的比較。最終的比較結果表明,在小檔案和大檔案的讀寫效能上,Redis都要勝過Memcached,特別是在大檔案讀寫方面,memcached效能不高。

在功能方面,可以參考資料[7]中的分析。該分析中指出Redis對Memcached的最大的補充是對持久化的支援,這使得在機器重新啓動或者升級時數據不至於丟失。

我的測試程式碼採用Java開發,開發環境爲Eclipse 3.7,如果需要我的全部測試程式碼,可以在評論裡留下郵箱,我會發過去。