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

回到顶部