본문 바로가기

Programing

Redis 대량 insert

Redis의 문서에서 대량의 inser방식을 찾아서 정리 

참고 : http://redis.io/topics/mass-insert



Protocol의 사용 


Redis로 대량 insert를 하기에는 여러가지 문제점이 있다. 

매번 클라이언드토 요청하는 것은 RTT(Round trip time)때문에 아주 느릴것이다. 

파이프라이닝(pipelining)을 사용할 수도 있겠지만 대량의 insert를 위해서는 수행한 후 그 결과들을 읽으면서 새로운 command들을 write하는 것이 필요하다. 


소수의 client만이 non-blocking I/O를 지원하며 또 모든 client가 최대의 처리량을 달성할 수 있도록 결과들을 효과적으로 파싱하지 못한다. 

이런 이유들 때문에 Redis는 row format으로 Redis protocol을 담은 text file을 import하는 방식을 제공한다. 


예를 들어 10억개의 key들이 'keyN -> ValueN' 형태로 insert되어야한다면 우리는 아래와 같이 Redis protocol 형식을 따르는 파일을 만들면 된다. 

SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN

이제 남은것은 이 파일을 Redis에 가능한한 빠르게 보내는 것이다. 예전 방식으로는 아래의 명령어를 통해 netcat으로 보내는 것이었다. 

(cat data.txt; sleep 10) | nc localhost 6379 > /dev/null

하지만 이런 방법은 안전하지 못한데 이유는 netcat이 데이터를 다 보냈는지 모르며 에러 또한 check할 수 없다. 

아직 불안전한 Redis의 branch에서는 pipe mode라고 불리는 새로운 모드의 redis-cli utility를 제공하는데 이 util은 대량의 insert를 위해 만들어졌다. 

pipe mode를 사용해서 아래와 같은 명령어로 실행이 가능하다. 

cat data.txt | redis-cli --pipe

그리고 결과로 아래와 같은 output을 생산한다. 

All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1000000

redis-cli utility는 또 standard output으로 에러만 출력되도록 해놓았다. 






'Programing' 카테고리의 다른 글

redis cluster 구성하기  (0) 2014.09.23
redis transaction  (0) 2014.09.10
redis pipeline  (0) 2014.09.10
redis  (0) 2014.09.08
logback  (0) 2014.07.25