hiredisの非同期呼び出し

1836 ワード

以下はhiredis非同期呼び出し使用の一例(公式の簡単な例の補足として、実際の業務で使用されているように見えるかもしれません)であり、一般的な使用シーンはポートを傍受し、要求が来たときにコールバックを実行し、コールバックにはRedisを読み書きする必要がある可能性があります.(IOに関する操作はすべて非同期処理が必要です!)
#include 
#include 
#include 

void do_accept(evutil_socket_t listener, short event, void *arg) {
    redisAsyncContext *ac = (redisAsyncContext *)arg;
    evutil_socket_t fd;
    struct sockaddr_in sin;
    socklen_t slen = sizeof(sin);
    fd = accept(listener, (struct sockaddr *)&sin, &slen);
    if (fd < 0) {
        perror("[ERROR] accept error");
        return;
    }
    redisAsyncCommand(ac, NULL, NULL, "SET key test");
}
int main() {
    signal(SIGPIPE, SIG_IGN);
    struct event_base *base = event_base_new();

    /*       */
    int listenfd;
    struct sockaddr_in servaddr;
    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("[ERROR] socket error");
        exit(-1);
    }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(17777);

    bind(listenfd, (const struct sockaddr*) &servaddr, sizeof(servaddr));

    if (listen(listenfd, 1024) < 0) {
        printf("[ERROR] listen error");
        exit(-1);
    }


    redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
    if (c->err) {
        /* Let *c leak for now... */
        printf("Error: %s
", c->errstr); return 1; } redisLibeventAttach(c,base); c->data = (void *)base; struct event *listen_event; listen_event = event_new(base, listenfd, EV_READ|EV_PERSIST, do_accept, (void *)c); event_add(listen_event, NULL); event_base_dispatch(base); return 0; }