hiredis发布/订阅示例

本文通过代码示例介绍了如何使用hiredis库进行Redis的发布/订阅操作。首先展示了编译代码的步骤,然后分别给出了订阅端和发布端的测试用例。在订阅端,运行程序后静候消息;在发布端,使用redis-cli发送PUBLISH命令将消息发布到指定频道。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

#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) 
### C++实现发布/订阅模式的示例代码 在C++中,发布/订阅模式可以通过多种方式实现。以下是一个简单的发布/订阅模式的实现示例,它不依赖于外部库(如`hiredis`),而是基于标准模板库(STL)[^1]。 ```cpp #include <iostream> #include <vector> #include <string> #include <functional> // 订阅者接口 class Subscriber { public: virtual void update(const std::string& message) = 0; virtual ~Subscriber() {} }; // 具体订阅者类 class ConcreteSubscriber : public Subscriber { private: std::string name; public: ConcreteSubscriber(const std::string& subscriberName) : name(subscriberName) {} void update(const std::string& message) override { std::cout << name << " received message: " << message << std::endl; } }; // 发布者类 class Publisher { private: std::vector<Subscriber*> subscribers; public: void subscribe(Subscriber* sub) { subscribers.push_back(sub); } void unsubscribe(Subscriber* sub) { subscribers.erase(std::remove(subscribers.begin(), subscribers.end(), sub), subscribers.end()); } void notify(const std::string& message) { for (auto sub : subscribers) { sub->update(message); } } }; int main() { Publisher publisher; ConcreteSubscriber sub1("Subscriber 1"); ConcreteSubscriber sub2("Subscriber 2"); publisher.subscribe(&sub1); publisher.subscribe(&sub2); publisher.notify("Hello Subscribers!"); publisher.unsubscribe(&sub1); publisher.notify("Goodbye Subscribers!"); return 0; } ``` 上述代码展示了如何使用C++实现一个基本的发布/订阅模式。在这个例子中,`Publisher`类负责管理订阅者列表,并在状态改变时通知所有订阅者。`Subscriber`接口定义了接收通知的方法,而`ConcreteSubscriber`类实现了该接口并处理接收到的消息[^3]。 如果需要与Redis集成以实现更复杂的发布/订阅功能,则可以参考`hiredis`库[^2]。下面是一个简单的Redis发布/订阅模式的伪代码示例: ```cpp #include <hiredis/hiredis.h> void redis_publisher() { redisContext *c = redisConnect("127.0.0.1", 6379); if (c == NULL || c->err) { if (c) { std::cerr << "Connection error: " << c->errstr << std::endl; redisFree(c); } else { std::cerr << "Connection attempt failed." << std::endl; } return; } redisReply *reply = (redisReply *)redisCommand(c, "PUBLISH channel1 Hello"); std::cout << "Message sent to " << reply->integer << " subscribers." << std::endl; freeReplyObject(reply); redisFree(c); } void redis_subscriber() { redisContext *c = redisConnect("127.0.0.1", 6379); if (c == NULL || c->err) { if (c) { std::cerr << "Connection error: " << c->errstr << std::endl; redisFree(c); } else { std::cerr << "Connection attempt failed." << std::endl; } return; } redisSubscribe(c, "channel1"); while (true) { redisReply *reply = (redisReply *)redisGetReply(c); if (reply != NULL) { std::cout << "Received message: " << reply->str << std::endl; freeReplyObject(reply); } } redisFree(c); } ``` 以上代码片段展示了如何使用`hiredis`库实现Redis的发布订阅功能。通过`PUBLISH`命令发送消息,通过`SUBSCRIBE`命令接收消息[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值