美文网首页Redis
hiredis之异步调用

hiredis之异步调用

作者: zczhuohuo | 来源:发表于2015-10-18 00:08 被阅读1366次

    下面是 hiredis 异步调用使用的一个例子(算是对于官方简单例子的一个补充,可能长得更像实际业务中使用的样子),一般使用场景是我们监听一个端口,当有请求来的时候,就执行回调,而回调里面可能需要读写 Redis。(涉及 IO 的操作都需要异步处理!)

    #include <hiredis/hiredis.h>
    #include <hiredis/adapters/libevent.h>
    #include <sys/socket.h>
    
    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\n", 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;
    }
    

    相关文章

      网友评论

      • ae1f95858d64:hiredis的异步接口只是给你展示一下怎么使用异步client(适配了不同的事件库,这个做的很巧妙哦),真正的项目里面要想使用,首先要有自己的事件循环,主线程的事件循环跑起来之后,基于全局的这个事件循环,才能跑异步的client
        efac1975226a:@zczhuohuo 请问你用起来了吗?
        zczhuohuo:@Coder盆盆 你说得对!但是实际使用起来还是有点复杂!
      • 6弦:不要误导别人,示例代码用的event_base_dispatch可以换成event_base_loop,并且在第二参数上添加EVLOOP_NONBLOCK即可实现非阻塞的调用
        zczhuohuo:@6弦 :+1: 嗯嗯!

      本文标题:hiredis之异步调用

      本文链接:https://www.haomeiwen.com/subject/xhyacttx.html