Hiredis: рдкрдм/рдЙрдк рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬреБрд▓ре░ 2011  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: redis/hiredis

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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

void onMessage(redisAsyncContext *c, void *reply, void *privdata) {
    redisReply *r = reply;
    if (reply == NULL) return;

    if (r->type == REDIS_REPLY_ARRAY) {
        for (int j = 0; j < r->elements; j++) {
            printf("%u) %s\n", j, r->element[j]->str);
        }
    }
}

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) {
        printf("error: %s\n", c->errstr);
        return 1;
    }

    redisLibeventAttach(c, base);
    redisAsyncCommand(c, onMessage, NULL, "SUBSCRIBE testtopic");
    event_base_dispatch(base);
    return 0;
}

рд╕рднреА 17 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИред рдореИрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдкрдм/рдЙрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ

рдЗрд╕рдХреЗ рд▓рд┐рдП +1, рдореБрдЭреЗ async libev pub/sub . рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдЖ рд░рд╣реА рд╣реИрдВ

ng рд▓рд┐рдП рдлрд╝реНрд▓реИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

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

void onMessage(redisAsyncContext *c, void *reply, void *privdata) {
    redisReply *r = reply;
    if (reply == NULL) return;

    if (r->type == REDIS_REPLY_ARRAY) {
        for (int j = 0; j < r->elements; j++) {
            printf("%u) %s\n", j, r->element[j]->str);
        }
    }
}

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) {
        printf("error: %s\n", c->errstr);
        return 1;
    }

    redisLibeventAttach(c, base);
    redisAsyncCommand(c, onMessage, NULL, "SUBSCRIBE testtopic");
    event_base_dispatch(base);
    return 0;
}

рдЙрдмрдВрдЯреВ 14.04 рдкрд░, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП libevent-dev рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди -levent рдзреНрд╡рдЬ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП SUBSCRIBE рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

redisAsyncCommand(c, onMessage, NULL, "SUBSCRIBE testtopic");
redisAsyncCommand(c, onAnotherMessage, NULL, "SUBSCRIBE anothertopic");
redisAsyncCommand(c, onReply, NULL, "SET toto 5");
redisAsyncCommand(c, onReply, NULL, "PUBLISH testtopic \"hello\"");
redisAsyncCommand(c, onReply, NULL, "GET toto");

рдФрд░ рдХреЗрд╡рд▓ 2 рдкрд╣рд▓реЗ рдЖрджреЗрд╢ рд╣реА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░рд╛ REDIS_OK рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди onReply() рдХреЙрд▓рдмреИрдХ рдХреЛ NULL рдЙрддреНрддрд░ рдорд┐рд▓рддрд╛ рд╣реИред

рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ 2 рд░реЗрдбрд┐рд╕ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдПрдХ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕ (рдФрд░ рдореЙрдирд┐рдЯрд░) рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рдмрд╛рдХреА рдХреЗ рд▓рд┐рдПред рд╢рд╛рдпрдж рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбреЙрдХреНрдЯрд░ рд╣реИ?

рдЬрдм рд╕реЙрдХреЗрдЯ рдЕрдВрддрддрдГ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЖрдк рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?

рдЬрдм рд╕реЙрдХреЗрдЯ рдЕрдВрддрддрдГ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЖрдк рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?

рдпрд╛ рдЖрдк рдХреИрд╕реЗ рддреЗрдЬреА рд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдлрд┐рд░ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдмреАрдЪ рдореЗрдВ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдкреИрдХреЗрдЯ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдЙрд╕ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдХреЗрд╡рд▓ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╕реЗ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреЗрдЬрдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯреАрд╕реАрдкреА рд░рдЦрд╡рд╛рд▓реЗ рдПрдПрд╕рд╡рд╛рдИрдПрдирд╕реА рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рд╡реИрд╕реЗ рднреА рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдЕрдВрддрд░рд╛рд▓, рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕, рдЖрджрд┐)

рдЖрдо рддреМрд░ рдкрд░ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдЖрдк рд╕реЙрдХреЗрдЯ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд░реНрд╡рд░ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд░реЗрдВ ...

рдЕрдЧрд░ рдХреБрдЫ рдФрд░ рдерд╛ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкрд┐рдВрдЧ рдХрдорд╛рдВрдб рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрд╢рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

@ рдЧреЗрд░рдкреЛрд░реНрдЧрд▓
рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореИрдВрдиреЗ redisAsyncSetDiconnectCallback рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдореИрдВрдиреЗ рдЗрд╕ рддрдВрддреНрд░ рдкрд░ рд╢реЛрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
https://github.com/nidhhoggr/temproxy_sentinel/commit/602e07cfdbd57a307ff008e8e9d41909ac34b004

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдШрдЯрдирд╛ рдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬреА рд╕реЗ (рдпрд╛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ) рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╣рдореЗрд╢рд╛ "рд╕рд╛рдЗрд▓реЗрдВрдЯ рдбрд┐рд╕реНрдХрдиреЗрдХреНрд╢рди" рдХрд╣рддрд╛ рд╣реВрдВ, рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ (рдореИрдВрдиреЗ 5 рд╕реЗ рдЕрдзрд┐рдХ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдорд┐рдирдЯ рдФрд░ рдШрдЯрдирд╛ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдлрд┐рд░ 10-15 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдПрдХ рдорд┐рд▓ рдЧрдпрд╛)

рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдк рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╕рдордп рднреА рдкрд┐рдВрдЧ рдХрдорд╛рдВрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд┐рдВрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рдВрджреЗрд╢ рдерд╛:
https://github.com/redis/hiredis/issues/351

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЬреЛ рдЕрдм рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 1 рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдкрд┐рдВрдЧ рднреЗрдЬрдирд╛, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдм рдкрд┐рдВрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ (рдпрд╛ рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рд╕реАрдорд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ) рддреЛ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдорд░ рдЪреБрдХрд╛ рд╣реИ, рдЕрдкрдирд╛ рд╕рдлрд╛рдИ рдХрд░реЗрдВ, рдлрд┐рд░ рдкреБрдирдГ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдФрд░ рддреЗрдЬ рд▓рдЧрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рдг рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЖрдк рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд░ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдмрд╡реЗрдВрдЯ рдФрд░ рд╣рд╛рдпрд░рдбрд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреВрд░реНрдг рдПрд╕рд┐рдВрдХ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рдЧреЗрд░рдкреЛрд░реНрдЧрд▓
рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдерд╛!
рдХрд┐рд╕реА рднреА рдореМрдХреЗ рд╕реЗ рдЖрдкрдиреЗ рдХреА-рд╕реНрдкреЗрд╕ рдЗрд╡реЗрдВрдЯ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрд╕реА redisAsyncCommand/Async рд╕рдВрджрд░реНрдн рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛?
рдореИрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ; рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ?

redis-cli config set notify-keyspace-events KEA
redisAsyncCommand(c, subscribeCallback, NULL, "PSUBSCRIBE __key*__:*");

@ рдЬреЛ-рдПрдЯ-рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрдореАрдбрд┐рдпрд╛
рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░ рд▓реА рд╣реИ .. рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рдкрд╕ рдЖ рд░рд╣рд╛ рд╣реВрдВ, рдкрд╣рд▓реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВред
рдбреЗрдЯрд╛ рдореЗрдВ рдХреЛрдИ рднреА рдЕрдкрдбреЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдирдореВрдирд╛ рдХреЛрдб рд╣реИ:

`

SUBSCRIBE_CHANNEL "SUBSCRIBE URLC_Updates" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

SUBSCRIBE_KEYEVENT рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ "PSUBSCRIBE '__key __: '"

SCAN_DB рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ "SCAN %d COUNT 100"

QUERY_KEY рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ "%s рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ"

рд╢реВрдиреНрдп
onPubsubMessage (redisAsyncContext * c, рд╢реВрдиреНрдп * рдЙрддреНрддрд░, рд╢реВрдиреНрдп * рдирд┐рдЬреА рдбреЗрдЯрд╛)
{
redisReply *r = (redisReply *) рдЙрддреНрддрд░;
рдЕрдЧрд░ (рдЙрддреНрддрд░ == NULL) рд╡рд╛рдкрд╕реА;

/* What if reply type is something else... */
if (r->type == REDIS_REPLY_ARRAY) {

    for (int j = 0; j < r->elements; j++) {
        if (r->element[j]->type == REDIS_REPLY_STRING) { 
            myPubsubFile.open(PUBSUB_FILE, fstream::in | fstream::out | fstream::app);
            myPubsubFile << r->element[j]->str << endl;
            myPubsubFile.close();
        } else if (r->element[j]->type == REDIS_REPLY_INTEGER) {
            cout << "Integer : "<< r->element[j]->integer << endl;
        }
    }
}
return;

}
рд╢реВрдиреНрдп
onKeyspaceMessage (redisAsyncContext * c, рд╢реВрдиреНрдп * рдЙрддреНрддрд░, рд╢реВрдиреНрдп * рдирд┐рдЬреА рдбреЗрдЯрд╛)
{
redisReply *r = (redisReply *) рдЙрддреНрддрд░;
рдЕрдЧрд░ (рдЙрддреНрддрд░ == NULL) рд╡рд╛рдкрд╕реА;

cout << "Got keyspace event notification from REDIS.. " << endl;

/* What if reply type is something else... */
if (r->type == REDIS_REPLY_ARRAY) {
    cout << "Type is an array.. " << endl;
    cout << "Number of elements here: " << r->elements << endl;

    for (int j = 0; j < r->elements; j++) {
        cout << "\t\t Type for element : " << r->element[j]->type << endl;
        if (r->element[j]->type == REDIS_REPLY_STRING) {
            cout << "\t\t\t" << r->element[j]->str << endl;
        } else if (r->element[j]->type == REDIS_REPLY_INTEGER) {
            cout << "\t\t\t" << "Integer : "<< r->element[j]->integer << endl;
        }   
    }   
} else {
    cout << "This is the type for response : " << r->type << endl;
}   
return;

}
рд╢реВрдиреНрдп*
pubsubRecipient(void* arg)
{
рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрд╡реЗрдВрдЯ_рдмреЗрд╕ * рдмреЗрд╕ = рдЗрд╡реЗрдВрдЯ_рдмреЗрд╕_рдиреНрдпреВ ();

redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
if (c->err) {
    printf("error: %s\n", c->errstr);
    return NULL;
}   

redisLibeventAttach(c, base);
redisAsyncCommand(c, onPubsubMessage    , NULL, SUBSCRIBE_CHANNEL);
redisAsyncCommand(c, onKeyspaceMessage  , NULL, SUBSCRIBE_KEYEVENT);

`

PS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рднрд╛рдЧ, рдЬреЛ REDIS рдореЗрдВ рдХреА-рд╕реНрдкреЗрд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИ; рдФрд░ рдореИрдВ рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдкреНрд░рднрд╛рд╡ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрдм рдореИрдВ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд░реЗрдбрд┐рд╕-рдХреНрд▓реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреА рдореБрдЦреНрдп рдШрдЯрдирд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ:

 "PSUBSCRIBE 'key*:*'"

рдХреНрдпрд╛ рдЙрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

"PSUBSCRIBE __key*__:*"

Ohk .. рдХреБрдЫ рдЕрдЬреАрдм рдЗрд╕ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реИ ... рдЬрдм рдореИрдВ рдирдХрд▓ рдХреА рдФрд░ рдореЗрд░реА рдХреЛрдб рдЪрд┐рдкрдХрд╛рдпрд╛ рдЖрд╕рдкрд╛рд╕ рдХреБрдВрдЬреА рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдЙрдкрд╕реНрдерд┐рдд рдереЗред

рдлрд┐рд░ рднреА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдореЗрд░реЗ _ _ рдХреБрдВрдЬреА * _ _ рдкреИрдЯрд░реНрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдерд╛ -> '' <- (рдПрдХрд▓ рдЙрджреНрдзрд░рдг)ред
redis-cli рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдЗрд╕реЗ рд░реЗрдбрд┐рд╕ рдХрдорд╛рдВрдб рдХреЗ рдЬрд░рд┐рдП рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИред

рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рджрд┐рдпреЛрдВ рдкрд╣рд▓реЗ рд╡рд┐рдХреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ (рдзрдиреНрдпрд╡рд╛рдж @aluiken)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕