ZBLOG

Qt通过hiredis库实现一个Redis的订阅类

下面是一个使用Qt和hiredis库实现Redis订阅功能的示例代码:

首先,确保已经安装了hiredis库,并在.pro文件中添加以下内容:

LIBS += -lhiredis

然后创建一个RedisSubscriber类来处理Redis的订阅功能,示例如下:

#include <QObject>
#include <QDebug>
#include <hiredis/hiredis.h>

class RedisSubscriber : public QObject {
    Q_OBJECT

public:
    explicit RedisSubscriber(QObject* parent = nullptr)
        : QObject(parent) {}

public slots:
    void subscribe() {
        redisContext* context = redisConnect("127.0.0.1", 6379); // 连接到Redis服务器

        if (context == nullptr || context->err) {
            qDebug() << "Error connecting to Redis: " << context->errstr;
            return;
        }

        redisReply* reply = static_cast<redisReply*>(redisCommand(context, "SUBSCRIBE channel_name")); // 订阅指定频道

        if (reply == nullptr || reply->type == REDIS_REPLY_ERROR) {
            qDebug() << "Error subscribing to channel: " << reply->str;
            freeReplyObject(reply);
            return;
        }

        qDebug() << "Subscribed to channel";

        while (true) {
            redisReply* message = nullptr;

            if (redisGetReply(context, reinterpret_cast<void**>(&message)) == REDIS_OK) { // 获取订阅消息
                if (message->type == REDIS_REPLY_ARRAY && message->elements >= 3) {
                    QString channel(message->element[1]->str);
                    QString data(message->element[2]->str);

                    qDebug() << "Received message from channel" << channel << ": " << data;
                }
            }

            freeReplyObject(message);
        }

        redisFree(context); // 断开与Redis的连接
    }
};

在Qt中使用RedisSubscriber类:

#include <QCoreApplication>
#include "redissubscriber.h"

int main(int argc, char* argv[]) {
    QCoreApplication a(argc, argv);

    RedisSubscriber subscriber;
    QObject::connect(&a, &QCoreApplication::aboutToQuit, [&]() {
        qDebug() << "Quitting...";
        subscriber.deleteLater();
    });

    subscriber.subscribe();

    return a.exec();
}

在上面的示例中,首先我们创建了一个RedisSubscriber类,其中包含了一个名为subscribe()的槽函数。在这个槽函数中,我们通过redisConnect()函数连接到Redis服务器,并使用redisCommand()函数发送SUBSCRIBE命令来订阅指定频道。

然后,在一个无限循环中,我们使用redisGetReply()函数获取订阅消息,并处理收到的消息。最后,通过redisFree()函数断开与Redis服务器的连接。

在main函数中,我们创建了RedisSubscriber对象,并将其槽函数与QCoreApplication::aboutToQuit信号关联起来。这样,在应用程序即将退出时,会调用deleteLater()方法释放资源。

运行以上代码,它将连接到本地Redis服务器并订阅名为”channel_name”的频道。当有新消息发布到该频道时,它会打印出接收到的消息。

请注意替换实际的Redis服务器地址和端口以及要订阅的频道名称。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=12075

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?