2013-04-25 2 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, которое было ранее зарегистрировано.

Вот полный пример:

#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-cli publish foo something 

Функция event_base_dispatch является та, которая на самом деле запускает цикл обработки событий , и заставляет его ждать по подписке Redis.

Смежные вопросы