1. 程式人生 > >Qt VS2013_Qt_Redis的配置

Qt VS2013_Qt_Redis的配置

一、下載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等待系統自己同步)