Erlang Redis Mnesia

數據庫性能測試

windows

測試環境: 系統:win7 ,內存:16G , CPU:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz ,單節點
寫(每條數據大小50Byte):
速率(不間斷寫入):25000條/秒
寫入上限:1200w條

無鎖讀(單條數據50Byte):
速率(不間斷讀取):35000條/秒
上限:無

鎖讀(單條數據50Byte):
速率(不間斷讀取):30000條/秒
上限:無

寫(單條數據200k):
速率(不間斷寫入): 5000條/秒
上限: 5W條

同時讀寫(單條數據50Byte):
速率: 20000條/秒
上限:800w條

寫入速率瓶頸在磁盤io,寫入規模與內存有關。超過寫上限時,內存飆升,寫入超時。

linux(單節點)

測試環境:
系統:Centos 5.8 ,內存:8G , CPU:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz ,單節點

寫(每條數據大小50Byte):
速率(不間斷寫入):25000條/秒(數據規模10w條)
寫入上限:600w條

無鎖讀(單條數據50Byte):
速率(不間斷讀取):3000條/秒(數據規模10w條)
上限:無

鎖讀(單條數據50Byte):
速率(不間斷讀取):2500條/秒(數據規模10w條)
上限:無

寫(單條數據200k):
速率(不間斷寫入): 2000條/秒(數據規模5w條)
上限: 5W條

同時讀寫(單條數據50Byte):
速率: 20000條/秒
上限:500w條
寫入速率瓶頸在磁盤io,寫入規模與內存有關。超過寫上限時,內存飆升,寫入超時。

linux(集羣)

服務器環境:
系統:Centos 5.8 ,內存:8G , CPU:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz 測試項目:(由兩個slave節點組成的集羣)

客戶端環境(本地虛擬機):
系統:Centos 7.0, 內存:8G , CPU:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 3.40GHz,測試方法:用tsung(壓力測試工具)模擬多個客戶端異步向服務器發起請求(每一次請求對應一次數據寫入)

寫(單條數據50k):
速率:7000條/秒
規模:100w條

讀(單條數據50k):
速率: 7000條/秒
規模:100w條

同時讀寫(單條數據50k):
速率:2500條/秒
規模:50w條

性能瓶頸在網絡io。

mensia 、自研數據庫、redis 比較

  mnesia 自研數據庫 redis
測試環境 linux 虛擬機 centos 7.0, erlang otp 17.5 linux 虛擬機 centos 7.0, erlang otp 17.5 linux 虛擬機 centos 7.0, erlang otp 17.5, Redis 2.8.7, eredis
單節點單進程(數據規模100w條)
寫耗時(單位秒) 36.6 37.3 223.5
讀耗時(單位秒) 29.8 14.0 217.4
刪除耗時(單位秒) 36.8 25.6 221
同時讀寫耗時(單位秒) 38.2/41.8 38.5/44.0 300/301
單節點多進程(數據規模100w條)
寫平均耗時(10個進程,單位秒) 104.3 154(無鎖) 373
讀平均耗時(10個進程,單位秒) 90.7 54.3 373
讀平均耗時(20個進程,單位秒) 196.1 97.0 746
讀平均耗時(40個進程,單位秒) 430.9 205.6 1465
讀平均耗時(50個進程,單位秒) 545.9 258.7 1773
單節點多進程(數據規模10w條)
讀平均耗時(10個進程,單位秒) 8.6 5.2 38
讀平均耗時(20個進程,單位秒) 19.2 9.8 74
讀平均耗時(40個進程,單位秒) 42.0 20.6 142
讀平均耗時(60個進程,單位秒) 67.3 31.7 214
單節點多進程(數據規模100w條,多張表)
讀寫平均耗時(10個進程,10張表,單位秒) 83/71 52/135 125/130
讀寫平均耗時(20個進程,20張表,單位秒) 179/170 115/270 243/251
讀寫平均耗時(40個進程,40張表,單位秒) 400/404 / 486/537

如何在Erlang中操作Redis?

下載和編譯:

git clone git://github.com/wooga/eredis.git
cd eredis
./rebar compile

在console中使用:

erl -pa ebin/
{ok, C} = eredis:start_link().
{ok, <<"OK">>} = eredis:q(C, ["SET", "foo", "bar"]).
{ok, <<"bar">>} = eredis:q(C, ["GET", "foo"]).

在模塊中使用:

save_order_id({Pid, DynData}) ->  

    {ok, Rds} = eredis:start_link(),  

    {_,Val} = ts_dynvars:lookup(order_id, DynData),  

    Id = binary_to_list(Val),  

    {ok, _} = eredis:q(Rds, ["RPUSH", "order_list", Id]).  

get_order_id({Pid, DynData}) ->  

    {ok, Rds} = eredis:start_link(),  

    {ok, Id} = eredis:q(Rds, ["LPOP", "order_list"]),  

    Id.  

redis使用

eredis 支持的命令

-SET 插入或修改 -DEL 刪除 -GET 讀取

-MSET 多條數據插入 -MGET 多條數據讀取

HASH hash相關命令

LIST list相關命令 -LPOP -LPUSH -RPUSH -LRANGE

SET set相關命令 -SADD

Transactions 事務相關命令 -MULTI -EXEC

Pipelining -多條語句順序執行

redis 安裝

服務端安裝部署
http://www.cnblogs.com/haoxinyue/p/3620648.html
http://blog.csdn.net/rachel_luo/article/details/8858250

redis 分佈式部署

http://blog.csdn.net/zq9017197/article/details/17357219
http://www.kokojia.com/article/9496.html
http://blog.csdn.net/pi9nc/article/details/17719737

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章