Hiredis Async

Redis Developer Course Redis Technical Support Redis Enterprise Server

Async 명령

레디스 명령을 비동기(Async)로 실행할 수 있는 방법은 몇 가지 있다. 여기서는 세 가지 방법을 소개한다.
레디스 버전 4.0.10 (2018년 6월 13일 발표)을 기준으로 작성했다.

AE: A simple event-driven programming library

Hiredis 설치

  • Hiredis 홈 페이지
  • Redis로 설치할 경우: Makefile에 prefix=/usr/local 이 설정되어 있으므로 make install 하면 C Header 파일은 /usr/local/include에 설치되고, Library 파일은 /usr/local/lib에 설치된다. Root를 사용한다.
  • Hiredis로 설치할 경우
  • /usr/local/include/에 설치된 header 파일들
  • /usr/local/lib/에 설치된 library 파일들
작업 디렉토리에 있어야할 파일들
  • ae.h: struct aeEventLoop 등이 포함되어 있다. src/ae.h 파일을 /usr/include 디렉토리에 복사한다. 이유는 sample C 소스에서 "hiredis/adapters/ae.h" 파일을 include하는데 이 ae.h에서 <ae.h>를 표준 디렉토리에서 include 하기 때문이다. adapters/ae.h 와 src/ae.h는 다른 파일이다.   ae.c에서는 "ae.h"를 include한다.   즉, src/ae.h 파일을 /usr/include에 복사해야 하고 작업 디렉토리에도 있어야 한다.
  • ae.c: aeCreateEventLoop() 등이 포함되어 있다.
  • ae_epoll.c, ae_evport.c, ae_kqueue.c, ae_select.c: ae.c에서 조건에 따라 이 파일들을 include 한다.
  • zmalloc.h: ae.c에서 이 파일을 include하고 zmalloc()를 사용한다.
  • zmalloc.c: zmalloc() 등이 포함되어 있다.
  • config.h, atomicvar.h: ae.c와 zmalloc.c에서 include하고 있다.   ae.h 부터 여기까지 소개된 파일들을 redis src/ 디렉토리로 부터 복사한다.
  • async-ae.c: Async 명령 sample C 소스 파일이다.
  • Makefile: async-ae.o, ae.o, zmalloc.o, hiredis library를 포함한다.

Sample C 소스 파일 async-ae.c

  • async-ae.c에서 #include <hiredis/adapters/ae.h> 이 파일은 redisAeAttach()를 포함하고 있으며,
    위에서 설명한 ae.h 파일을 포함하고,
    hiredis.h와 async.h를 포함하고 있다. 그러므로 async-ae.c에서 이 두 파일을 포함하지 않아도 된다.
  • async-ae.c
  • cmdCallback(): Async 명령 callback 함수, 세번째 인수는 void *cmd는 원래는 void *privdata 인데 실행 명령을 넣어서 실패시 표시하도록 했다.
  • connectCallback(): Async 연결 callback 함수, ac->c.tcp.host는 IP를, ac->c.tcp.port는 포트를, ac->errstr는 에러 메시지를 가지고 있다.
  • struct redisAsyncContext
  • struct redisContext
  • aeMain(): 실제로 event를 처리하는 함수이므로 Connection과 Async 명령 다음에 있어야 한다. 즉, Main() 소스의 맨 마지막에 있어야 한다.
  • aeMain() 소스: ae.c에 있다.
  • aeStop() 소스: ae.c에 있다.
  • 실행 결과
  • 레디스 서버가 다운되었을 때 실행 결과

LIBEV

  • libev 홈 페이지
  • libev library 설치하기: /usr/local에 설치할 것이므로 root를 사용한다.
  • /usr/local/include/에 설치된 header 파일들
  • 여기서 event.h 파일에 주의해야 한다. 이 파일은 libevent library에도 동일한 이름의 event.h 파일이 있다. 즉, 나중에 설치한 library의 event.h 파일이 include에 있게 되는 것이다. Libev를 먼저 설치하고 Libevent를 나중에 설치하면 별 문제가 없지만, 순서를 바꾸어서 설치하면 Libevent를 이용한 Async 프로그램이 동작하지 않는다. 이 경우 Libevent에 있는 event.h를 /usr/local/include에 복사하고 다시 컴파일하면 된다.
  • /usr/local/lib/에 설치된 library 파일들
  • Makefile
  • async-libev.c

LIBEVENT: An event notification library

  • libevent 홈 페이지
  • libevent library 설치하기: /usr/local에 설치할 것이므로 root를 사용한다.
  • /usr/local/include/에 설치된 header 파일들
  • /usr/local/lib/에 설치된 library 파일들 중 중요한 것을 표시했다.
  • Makefile
  • async-libevent.c

관련 정보

  • libevent 및 libev로 네트워크 성능 향상
  • hiredis/examples에 몇 가지 예제가 있다.


<< Pipeline Async Server >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.