2013-04-25 136 views
2

我使用hiredis C庫連接到redis服務器。在訂閱新消息後,我無法弄清楚如何等待新消息。Hiredis等待消息

我的代碼如下所示:

signal(SIGPIPE, SIG_IGN); 
    struct event_base *base = event_base_new(); 

    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); 
    redisAsyncSetConnectCallback(c, connectCallback); 
    redisAsyncSetDisconnectCallback(c, disconnectCallback); 
    redisAsyncCommand(c, NULL, NULL, "SET key %b", argv[argc - 1], 
        strlen(argv[argc - 1])); 
    redisAsyncCommand(c, getCallback, (char*) "end-1", "GET key"); 
    redisAsyncCommand(c, getCallback, (char*) "end-1", "SUBSCRIBE foo"); 

現在該怎麼告訴hiredis等待與渠道的消息?

回答

7

您不必告訴hiredis您需要在頻道上等待:事件循環將等待先前已註冊的Redis連接。

下面是一個完整的例子:

redis-cli publish foo something 

的event_base_dispatch功能是實際啓動事件循環的一個:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <signal.h> 
#include "hiredis.h" 
#include "async.h" 
#include "adapters/libevent.h" 

void subCallback(redisAsyncContext *c, void *r, void *priv) { 
    redisReply *reply = r; 
    if (reply == NULL) return; 
    if (reply->type == REDIS_REPLY_ARRAY && reply->elements == 3) { 
     if (strcmp(reply->element[0]->str, "subscribe") != 0) { 
      printf("Received[%s] channel %s: %s\n", 
        (char*)priv, 
        reply->element[1]->str, 
        reply->element[2]->str); 
     } 
    } 
} 

void connectCallback(const redisAsyncContext *c, int status) { 
    if (status != REDIS_OK) { 
     printf("Error: %s\n", c->errstr); 
     return; 
    } 
    printf("Connected...\n"); 
} 

void disconnectCallback(const redisAsyncContext *c, int status) { 
    if (status != REDIS_OK) { 
     printf("Error: %s\n", c->errstr); 
     return; 
    } 
    printf("Disconnected...\n"); 
} 

int main (int argc, char **argv) { 
    signal(SIGPIPE, SIG_IGN); 
    struct event_base *base = event_base_new(); 

    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); 
    redisAsyncSetConnectCallback(c,connectCallback); 
    redisAsyncSetDisconnectCallback(c,disconnectCallback); 
    redisAsyncCommand(c, subCallback, (char*) "sub", "SUBSCRIBE foo"); 

    event_base_dispatch(base); 
    return 0; 
} 

您可以只使用下面的命令來發布一些測試,並讓它在Redis訂閱上等待。