Qt VS2013_Qt_Redis的配置

来源:互联网 发布:淘宝积分兑换优惠券 编辑:程序博客网 时间:2024/06/05 08:27

本文参考教程:http://www.cnblogs.com/raker/p/4368741.html感谢作者分享。

 

一、下载redis源代码。

1.1 下载源码

通过https://github.com/MSOpenTech/redis 下载源码。

 

也可以通过我个人的云盘下载。

http://pan.baidu.com/s/1skBtc4l

 

二、编译reids

2.1 编译源码

(1)下载源码后解压到本地磁盘(我放到C:/WorkSpace/目录下)。

 

(2) 使用vs2013打开redis-3.0/msvc/RedisServer.sln

 

(3) 相关配置

点击菜单栏中【PROJECT->Properties->Configuration Properties->C/C++->Runtime Library->Multi-threaded Debug DLL(/MDd)】,点击确定。

注:因为需要在Qt工程中使用redis,所以这里需要选择MDd类型。如果是其他类型的工程这里的选项可能不同。

 

(4) 根据实际需求,选择相应的版本Debug/Releasex86/x64

 

(5) 构建所有项目,成功构建9个项目。

 

编译后生成文件如下(还有很多obj文件,为了方便截图被我删除掉了)

 

 

(6) 图中有5exe可执行文件,分别是:

redis-serverRedis服务器的daemon启动程序

redis-cliRedis命令行操作工具。也可以用telnet根据其纯文本协议来操作

redis-benchmarkRedis性能测试工具,测试Redis在当前系统下的读写性能

redis-check-aof:数据修复

redis-check-dump:检查导出工具

(6) 打包文件

C:/WorkSpace目录下手动创建目录【redis】,进入redis目录创建两个子目录【include】【lib】【bin

将上图中的hiredis.libWin32_Interop.lib放到刚刚创建的【lib】目录中。

复制redis源码目录中src目录下的Win32_Interop目录到【include】目录中,复制deps下的hiredis目录到【include】目录下(使用src文件夹下的fmacros.h替换掉hiredis目录中的fmacros.h文件)。

复制src/Win32_Interop/win32fixes.c到自己的工程目录

 

 

2..3 双击运行RedisServer.exe启动服务端

 

 

三、Qt项目中配置redis

 

3.1新建QtGUI工程(我的工程路径放在C:\WorkSpace\目录下)

 

 

3.2 在工程中添加redis配置配置

 

 

 


测试代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "hiredis\hiredis.h"
#define NO_QFORKIMPL //这一行必须加才能正常使用
#include "Win32_Interop\win32fixes.h"
#pragma comment(lib,"hiredis.lib")
#pragma comment(lib,"Win32_Interop.lib")
#include <QApplication>
#include <QDebug>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    struct timeval timeout = { 1, 500000 }; // 1.5 seconds
    redisContext *c = redisConnectWithTimeout((char*)"127.0.0.1", 6379, timeout);
    if (c->err)
    {
        qDebug()<<"Connection error: %s\n"<<c->errstr;
        exit(1);
    }

    /* PING server */
    redisReply *reply = (redisReply *)redisCommand(c, "PING");
    qDebug()<<"PING: "<< reply->str;
    freeReplyObject(reply);

    /* Set a key */
    reply = (redisReply *)redisCommand(c, "SET %s %s", "foo", "hello world");
    qDebug() << "SET: "<< reply->str;
    freeReplyObject(reply);

    /* Set a key using binary safe API */
    reply = (redisReply *)redisCommand(c, "SET %b %b", "bar", 3, "hello", 5);
    qDebug()<< "SET (binary API): "<<reply->str;
    freeReplyObject(reply);

    /* Try a GET and two INCR */
    reply = (redisReply *)redisCommand(c, "GET foo");
    qDebug()<<"GET foo: "<<reply->str;
    freeReplyObject(reply);

    reply = (redisReply *)redisCommand(c, "INCR counter");
    qDebug()<<"INCR counter: %lld\n"<<reply->integer;
    freeReplyObject(reply);
    /* again ... */
    reply = (redisReply *)redisCommand(c, "INCR counter");
    qDebug()<<"INCR counter: %lld\n"<< reply->integer;
    freeReplyObject(reply);

    /* Create a list of numbers, from 0 to 9 */
    reply = (redisReply *)redisCommand(c, "DEL mylist");
    freeReplyObject(reply);
    for (unsigned int j = 0; j < 10; j++)
    {
        char buf[64];

        sprintf_s(buf, 64, "%d", j);
        reply = (redisReply *)redisCommand(c, "LPUSH mylist element-%s", buf);
        freeReplyObject(reply);
    }

    /* Let's check what we have inside the list */
    reply = (redisReply *)redisCommand(c, "LRANGE mylist 0 -1");
    if (reply->type == REDIS_REPLY_ARRAY)
    {
        for (unsigned int j = 0; j < reply->elements; j++)
        {
            qDebug() << j << reply->element[j]->str;
            getchar();
        }
    }
    freeReplyObject(reply);

    return app.exec();
}

编译报错如下:

 

双击错误提示跳到hiredis.h文件中,修改包含头文件的路径。

 

 

运行效果下如:


四、修改redis配置文件,根目录下的redis.conf文件

参数介绍:

daemonize:是否以后台daemon方式运行

pidfilepid文件位置

port:监听的端口号

timeout:请求超时时间

loglevellog信息级别

logfilelog文件位置

databases:开启数据库的数量

save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

rdbcompression:是否使用压缩

dbfilename:数据快照文件名(只是文件名,不包括目录)

dir:数据快照的保存目录(这个是目录)

appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

appendfsyncappendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

 

0 0