如何在C ++中使用带有hiredis的Pub / sub?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中使用带有hiredis的Pub / sub?相关的知识,希望对你有一定的参考价值。

我试图通过c ++用hiredis客户端测试redis的这个pub / sub函数。

我可以看到订阅某个频道似乎很容易通过redisCommand Api完成。

但是,我想知道当有人发布到某个服务器时,回复是如何回来的。

谢谢

答案

https://github.com/redis/hiredis/issues/55 aluiken于2012年3月2日发表评论

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
", 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
", c->errstr);
        return 1;
    }

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

这是一个迟到的答案,但您可以尝试redis-plus-plus,它基于hiredis,并用C ++ 11编写。

免责声明:我是这个图书馆的作者。如果您对此客户有任何问题,请随时访问let me know。如果你喜欢它,也可以随意加星:)

示例代码:

Redis redis("tcp://127.0.0.1:6379");

// Create a Subscriber.
auto sub = redis.subscriber();

// Set callback functions.
sub.on_message([](std::string channel, std::string msg) {
    // Process message of MESSAGE type.
});

sub.on_pmessage([](std::string pattern, std::string channel, std::string msg) {
    // Process message of PMESSAGE type.
});

sub.on_meta([](Subscriber::MsgType type, OptionalString channel, long long num) {
    // Process message of META type.
});

// Subscribe to channels and patterns.
sub.subscribe("channel1");
sub.subscribe({"channel2", "channel3"});

sub.psubscribe("pattern1*");

// Consume messages in a loop.
while (true) {
    try {
        sub.consume();
    } catch (...) {
        // Handle exceptions.
    }
}

检查doc的详细信息。

另一答案

观察者模式是我们在Redis的pub / sub特性中看到的。

所有订阅者都是观察者,主题是发布者正在修改的频道。

当发布者修改一个频道,即执行像redis-cli这样的命令时,发布foo值这个改变由Redis服务器传递给所有观察者(即订阅者)

因此,Redis服务器具有特定通道的所有观察者的列表。

以上是关于如何在C ++中使用带有hiredis的Pub / sub?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Objective C中使用XML解析发布带有特殊字符和泰语的字符串?

在R中使用带有折叠的粘贴时如何创建引号[重复]

如何在 C 语言中使用带有 REGS 结构的 int86 函数读取和显示文件数据,用于 8086

如何在另一个java项目中使用带有共享对象的jar文件

如何使用自动工具编译带有 clang 和选项 -std=c++11 的项目

如何在带有 Tortoise git 的 Windows 上使用 linux 生成的密钥?