Erlang和Redis:读取性能
尝试从Redis排序集中读取1M记录时突然遇到性能问题。我使用ZSCAN
的光标和批处理大小为5K。
代码是在托管Redis的同一台计算机上使用Erlang R14执行的。批量接收5K元素大约需要1秒。不幸的是,我无法在这台机器上编译Erlang
R16,但是我认为这没有关系。
为了进行比较,带有node_redis(hiredis解析器)的Node.js代码在2秒内达到了1M。Python和PHP的结果相同。
也许我做错了什么?
提前致谢。
这是我的Erlang代码:
-module(redis_bench).-export([run/0]).
-define(COUNT, 5000).
run() ->
{_,Conn} = connect_to_redis(),
read_from_redis(Conn).
connect_to_redis() ->
eredis:start_link("host", 6379, 0, "pass").
read_from_redis(_Conn, 0) ->
ok;
read_from_redis(Conn, Cursor) ->
{ok, [Cursor1|_]} = eredis:q(Conn, ["ZSCAN", "if:push:sset:test", Cursor, "COUNT", ?COUNT]),
io:format("Batch~n"),
read_from_redis(Conn, Cursor1).
read_from_redis(Conn) ->
{ok, [Cursor|_]} = eredis:q(Conn, ["ZSCAN", "if:push:sset:test", 0, "COUNT", ?COUNT]),
read_from_redis(Conn, Cursor).
回答:
切换到redis-erl可以将1M键的读取时间减少到16秒。不快,但是可以接受。
这是新代码:
-module(redis_bench2).-export([run/0]).
-define(COUNT, 200000).
run() ->
io:format("Start~n"),
redis:connect([{ip, "host"}, {port, 6379}, {db, 0}, {pass, "pass"}]),
read_from_redis().
read_from_redis(<<"0">>) ->
ok;
read_from_redis(Cursor) ->
[{ok, Cursor1}|_] = redis:q(["ZSCAN", "if:push:sset:test", Cursor, "COUNT", ?COUNT]),
io:format("Batch~n"),
read_from_redis(Cursor1).
read_from_redis() ->
[{ok, Cursor}|_] = redis:q(["ZSCAN", "if:push:sset:test", 0, "COUNT", ?COUNT]),
read_from_redis(Cursor).
以上是 Erlang和Redis:读取性能 的全部内容, 来源链接: utcz.com/qa/416892.html