本文使用的是 hiredis 库来进行 redis 的连接的,并且将 redis 和 hiredis 都
进行了打包,使用 qt 进行 redis 的连接和使用可以直接从下面这个链接下载。
链接:https://pan.baidu.com/s/17fXKOj5M4VIypR0y5_xtHw
提取码:1234
添加 hiredis库 并 实现配置
下载完之后,
第一步:在工程目录中建立一个 lib 文件夹,进入 Redis\qt-hi-redis-master\QtHiRedis\debug
里面把 libQtHiRedis.a 和 QtHiRedis.dll 复制到这个目录下,然后把 QtHiRedis.dll
复制到工程的 .pro 同级目录下
第二步:在工程中新建一个 includes 文件夹,进入 Redis\qt-hi-redis-master\QtHiRedis\src
里面,将所有的 .h 头文件都复制到这个目录下
第三步:在工程配置文件中用 INCLUDEPATH += ./includes 将刚才的 includes 文件夹
的路径添加上,这里的 += 后面的路径为你的文件夹的路径
第四步:右击项目(例如图中的 SA_Course),选择添加库->外部库,配置如下图所示,
将刚才的 .a 库包含进去,添加完成后不需要修改 .pro,保持默认就好
需要注意的是,在 .pro 配置文件里面需要修改
QT += core gui network
这个配置,有的时候会因为这个配置没有齐全,而导致引用库里面的一些头文件
无法识别,其他的一些 qt pro文件 基本配置,默认您已经配置完成
redis的使用
之前在网上查找了很多的 qt 使用 redis 的代码,发现他们的代码都冗长,不
易理解和使用,所以在这里我简化一下,来谈谈 qt 如何通过 hiredis 连接 redis,
而不是复制粘贴代码。
对于 hiredis 的介绍,下面这位大佬的博客写的很详细,有兴趣可以看看
hiredis基础
废话不多说,进入正题,qt 连接 redis 其实就分成三步
1、连接 redis
2、执行 redis 本身的指令
3、释放资源
简单来说就是通过 redisConnect函数 来连接 redis,通过 redisCommand函数
执行 redis 指令并获取返回值,最后通过 redisFree函数 来释放数据库连接,需要
注意的是,在每一次使用完 redisCommand 返回值的时候,需要通过 freeReplyObject
函数来释放返回值的地址。当然,这里提到的函数只是简单的说明 hiredis 的调用流程,
在实际应用中你可以调用其他同类的函数,具体上面的博客里面有说明,不过大体流程
就是这三步。
至于 redis 指令,下面这篇博客说明的很详细,这里就不再造轮子了
redis常用指令大全
我的代码及运行结果
.h头文件
#ifndef REDIS_H
#define REDIS_H
#include <hiredis.h>
class Redis
{
public:
Redis();
// 连接 redis
void ConnectRedis();
// 执行 redis命令
void ExecRedis();
// 释放资源
void FreeRedis();
// 释放 reply 指针
void FreeReply();
private:
// redis 句柄
redisContext *m_context;
// redis 执行返回数据
redisReply *m_reply;
// 执行命令的 cmd 字符串
char * m_cmd;
// 连接 ip,端口
char * m_ip;
int m_port;
};
#endif // REDIS_H
.cpp文件
#include "redis.h"
#include <QDebug>
Redis::Redis()
{
// 初始化 ip, 端口
m_ip = "127.0.0.1";
m_port = 6379;
/*
连接测试
*/
ConnectRedis();
// 设置一个整数
m_cmd = "set m_int 110";
ExecRedis();
FreeReply();
// 获取设置到的整数
m_cmd = "get m_int";
ExecRedis();
if(m_reply != NULL)
{
qDebug() << m_reply->str;
}
else
{
qDebug() << "no reply";
}
FreeRedis();
}
// 连接 redis
void Redis::ConnectRedis()
{
m_context = redisConnect(m_ip, m_port);
if(m_context == NULL)
{
qDebug() << "connect error";
}
}
// 执行 redis 命令
void Redis::ExecRedis()
{
m_reply = (redisReply*)redisCommand(m_context, m_cmd);
}
// 释放 redis 资源
void Redis::FreeRedis()
{
// 释放数据库连接
if(m_context)
{
redisFree(m_context);
}
// 释放可能没有释放掉的 redisReply
FreeReply();
}
// 释放 reply 指针
void Redis::FreeReply()
{
if(m_reply != NULL)
{
freeReplyObject(m_reply);
}
}
结果: