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++】
注:因為需要在Qt工程中使用redis,所以這裡需要選擇MDd型別。如果是其他型別的工程這裡的選項可能不同。
(4) 根據實際需求,選擇相應的版本Debug/Release、x86/x64
(5) 構建所有專案,成功構建9個專案。
編譯後生成檔案如下(還有很多obj檔案,為了方便截圖被我刪除掉了)
(6) 圖中有5個exe可執行檔案,分別是:
redis-server:Redis伺服器的daemon啟動程式
redis-cli:Redis命令列操作工具。也可以用
redis-benchmark:Redis效能測試工具,測試Redis在當前系統下的讀寫效能
redis-check-aof:資料修復
redis-check-dump:檢查匯出工具
(6) 打包檔案
在C:/WorkSpace目錄下手動建立目錄【redis】,進入redis目錄建立兩個子目錄【include】【lib】【bin】
將上圖中的hiredis.lib和Win32_Interop.lib放到剛剛建立的【lib】目錄中。
複製redis原始碼目錄中src目錄下的Win32_Interop目錄到【include】目錄中,複製deps下的hiredis目錄到【include】目錄下(使用src資料夾下的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方式執行
pidfile:pid檔案位置
port:監聽的埠號
timeout:請求超時時間
loglevel:log資訊級別
logfile:log檔案位置
databases:開啟資料庫的數量
save * *:儲存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動儲存快照。可設定多個條件。
rdbcompression:是否使用壓縮
dbfilename:資料快照檔名(只是檔名,不包括目錄)
dir:資料快照的儲存目錄(這個是目錄)
appendonly:是否開啟appendonlylog,開啟的話每次寫操作會記一條log,這會提高資料抗風險能力,但影響效率。
appendfsync:appendonlylog如何同步到磁碟(三個選項,分別是每次寫都強制呼叫fsync、每秒啟用一次fsync、不呼叫fsync等待系統自己同步)