2013-10-01 4 views
1

이 목록이 redis 클라이언트 "hiredis"에 대한 질문을하는 데 적합 할 것입니다. 나는 아래 redis 클라이언트와 같은 일을하고 싶다. 알 수 있듯이 redis는 하나의 rpush 호출로 3 개의 다른 레코드를 보냅니다. 내가 사용하는 내 프로젝트에서 hiredis를 사용하여 한 번의 호출로 여러 레코드 보내기

redis 127.0.0.1:6379> rpush test kemal erdem husyin 

(integer) 3 
redis 127.0.0.1:6379> lrange test 0 -1 
1) "kemal" 
2) "erdem" 
3) "husyin" 

는 예를 들어 hiredis :

reply = (redisReply*)(redisCommand(c, "RPUSH %s %s" , channelName, message)); 

을하지만 지금은 모든 라인이 char[][] 같은 버프에서 보류되고있는 큰 로그 파일을 가지고; 각 레코드를 다른 레코드로 보내야하지만 성능을 위해서는 rpush를 한 번만 호출해야합니다. 나에게 조언이 필요합니까?

답변

2

수천 개가 넘는 항목을 푸시하기 위해 고유 한 명령을 보내는 것은 좋지 않은 생각입니다. 통신 버퍼가 포화되어 큰 명령은 Redis의 단일 스레드 특성으로 인해 다른 모든 동시 명령을 차단합니다.

푸시 명령을 n 개 항목 (n은 10 ~ 100)의 작은 패킷 배치로 작성하고 pipeline m 명령 (m은 10 ~ 100)으로 푸시 명령을 그룹화하는 것이 좋습니다. 그것만 (N은 입력 파일의 라인 수이다) N/(N 개 *의 m) 왕복 생성

While there are still lines to read: 
    New Redis pipeline, i=0 
    While there are still lines to read and i<m: 
     Read at most n lines 
     Build push command for the read lines 
     Pipeline push command 
     ++i 
    Flush Redis pipeline, check return status if needed 

:

알고리즘은 다음과 같이 될 것이다.

임의의 수의 매개 변수로 명령을 작성하려면 redisAppendCommandArgv 함수를 사용할 수 있습니다.

관련 문제