如何在Erlang中操作Redis?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gohuge/article/details/79878546

数据库性能测试

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


猜你喜欢

转载自blog.csdn.net/gohuge/article/details/79878546