尝试从Redis排序集中读取1M记录时突然遇到性能问题。我使用ZSCAN的光标和批处理大小为5K。
ZSCAN
代码是在托管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).