복붙노트

[REDIS] 얼랑 및 레디 스 : 읽기 성능

REDIS

얼랑 및 레디 스 : 읽기 성능

레디 스를 소트 세트에서 100 만 기록을 읽으려고 할 때 갑자기 성능 문제가 발생했습니다. 나는 커서 및 배치 크기 5K로 ZSCAN을 사용했다.

코드는 호스트 레디 스 같은 시스템에 얼랑 R14를 사용하여 실행되었다. 5K 요소 일괄 받기 1초 근처 걸린다. 불행하게도,이 컴퓨터에 얼랑 R16를 컴파일하는 데 실패,하지만 난 그게 중요하지 않습니다 생각합니다.

비교를 위해, node_redis (hiredis 파서)와 Node.js를 코드 2 초 1M을한다. Python과 PHP에 대한 동일한 결과.

어쩌면 내가 뭔가 잘못을합니까?

미리 감사드립니다.

여기 내 얼랑 코드는 다음과 같습니다

-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).

해결법

  1. ==============================

    1.10 회 9 밖으로,이 같은 속도 저하는 더이 시스템의 결과보다 심하게 작성된 드라이버의 결과이다. 이 경우, 레디 스 파이프 라인을 요청 할 수있는 능력이 중요 할 것입니다. 리두 같은 클라이언트는 파이프 라인을 어쩌면 빠르게 할 수 있습니다.

    10 회 9 밖으로,이 같은 속도 저하는 더이 시스템의 결과보다 심하게 작성된 드라이버의 결과이다. 이 경우, 레디 스 파이프 라인을 요청 할 수있는 능력이 중요 할 것입니다. 리두 같은 클라이언트는 파이프 라인을 어쩌면 빠르게 할 수 있습니다.

    또한, 하나의 프로세스 측정을 조심 / 스레드 만. 당신이 빠른 동시 액세스를 원하는 경우에, 그것은 종종 빠른 순차 액세스에 대해 상쇄된다.

  2. ==============================

    2.레디 스-ERL로 전환 16 초 1M 키의 읽기 시간이 감소 하였다. 빠르지 만 허용.

    레디 스-ERL로 전환 16 초 1M 키의 읽기 시간이 감소 하였다. 빠르지 만 허용.

    여기에 새로운 코드는 다음과 같습니다

    -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).
    
  3. from https://stackoverflow.com/questions/22577849/erlang-and-redis-read-performance by cc-by-sa and MIT license