一 redis源码编译
很多博客对redis的源码编译都说的很笼统,按照他们的方法基本都编译失败了,redis的windows版目前最新版本是3.2,linux版最新是5.0,windows系统用C++连接redis不太方便,如果是Java,用maven下载jedis jar包,配置一下,很好连接redis,而C++则比较麻烦,下面介绍如何用VS2013编译redis源码,并连接redis做项目开发。
windows版redis源码链接: https://github.com/microsoftarchive/redis/tree/3.2,目前版本分支的是3.2,翻到页面最下面,可以看到相关的使用、编译、测试等说明。
根据官网说明可知,用VS2013编译,但是必须更新到update5, 否则会出现各种编译错误,确实如此,之前用vs2013的其它版本,出现各种错误,无法修改。
打开VS2013---帮助---关于,即可查看自己的VS版本,例如我重装之后的update5:
不是VS2013 update5的可以下载重装。
vs2013 update5下载链接:http://www.121down.com/soft/softview-43319.html
打开redis-win-3.2.100\msvs\RedisServer.sln 一共9个项目:
把RedisServer设为启动项目(默认已经设置),编译,如果是update5版的VS2013,是没有编译错误的,可以设置x86, x64,运行结果如下:
也可以断点调试
以上是服务端程序,其它的如客户端redis-cli, 断点之后,再启动客户端可以进行相关代码调试。
二 C++ 连接redis
用VS2013创建一个win32控制台程序进行连接测试。需要包含源码中的头文件和编译好的静态库。
头文件:
lib库目录
无需其它dll, 注意默认编译平台是mixxed platform, 生成的lib和exe在release 目录,不过影响不大,手动改成x86或x64就会到相关目录
C++ 连接redis主要使用hiredis的代码,有些博客的说法有错误,例如:
(1)把/ src / 下的win32fixes.c放到项目目录下(即main.cpp文件所在位置),我的代码没有这样做;
(2)hiredis只能在linux上使用,现在也可以在windows上使用;
redis执行程序下载连接:https://github.com/microsoftarchive/redis/releases 解压到任意目录,双击redis-server.exe即可运行。然后编写代码,连接redis-server.
示例代码如下:#include "hiredis.h"
#include <windows.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "hiredis.lib")
#pragma comment(lib, "Win32_Interop.lib")
void doTest()
{
redisContext* c = redisConnect("127.0.0.1", 6379);
if (c->err)
{
cout << "Connect to redisServer failed: " << c->errstr << endl;
redisFree(c);
return;
}
cout << "Connect to redisServer Success" << endl;
const char* command1 = "set test1 value1";
redisReply* r = (redisReply*)redisCommand(c, command1);
if (NULL == r)
{
cout << "Execut command1 failed" << endl;
redisFree(c);
return;
}
if (!(r->type == REDIS_REPLY_STATUS && (strcmp(r->str, "OK") == 0 || strcmp(r->str, "ok") == 0)))
{
cout << "Failed to execute command: " << command1 << endl;
freeReplyObject(r);
redisFree(c);
return;
}
freeReplyObject(r);
cout << "Succeed to execute command" << command1 << endl;
const char* command2 = "strlen test1";
r = (redisReply*)redisCommand(c, command2);
if (r->type != REDIS_REPLY_INTEGER)
{
cout << "Failed to execute command" << command2 << endl;
freeReplyObject(r);
redisFree(c);
return;
}
int length = r->integer;
freeReplyObject(r);
cout << "The length of 'test1' is : " << length << endl;
cout << "Succeed to execute command :" << command2 << endl;
const char* command3 = "get test1";
r = (redisReply*)redisCommand(c, command3);
if (r->type != REDIS_REPLY_STRING)
{
cout << "Failed to execute command : " << command3 << endl;
freeReplyObject(r);
redisFree(c);
return;
}
cout << "The value of 'test1' is : " << r->str << endl;
freeReplyObject(r);
cout << "Succeed to execute command : " << command3 << endl;
const char* command4 = "get test2";
r = (redisReply*)redisCommand(c, command4);
if (r->type != REDIS_REPLY_NIL)
{
cout << "Failed to execute command : " << command4 << endl;
freeReplyObject(r);
redisFree(c);
return;
}
freeReplyObject(r);
cout << "Succeed to execute command : " << command4 << endl;
redisFree(c);
}
int main()
{
WSADATA wsaData;
int nRet;
if ((nRet = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
cout << "WSAStartup failed" << endl;
exit(0);
}
doTest();
system("pause");
return 0;
} redis的连接编译比较坑,mmp, 我试了几次,才解决一些编译错误,还有之前一些博客的错误引导,坑的一笔。代码贴完后,需要对VS属性做一些修改,如下:
1.
2
如果还有其它错误,请自行查询修改
代码如果没有错误,运行 结果如下:
|