1.下载源码https://github.com/microsoftarchive/redis
第一次打开的时候VS2019会检测解决方案工具集,提示升级,点击确定即可,将工具集升级到最新或者下载对于的v120工具集
hiredis的编译配置
只需要右键hiredis工程和Win32_Interop工程,分别点击生成,生成hiredis.lib和Win32_Interop.lib即可。
可能会报错system_error不是"std"成员…
解决方法
找到Win32_variadicFunctor.cpp和Win32_FDAPI.cpp分别加上#include <system_error>
再重新编译生成.
在\redis-win-3.2.100\msvs\x64\Debug目录中可以看到两个静态链接库文件:hiredis.lib和Win32_Interop.lib, 至此,我们需要的文件和链接库都有了,接下来就是怎么配置使用的问题了。
新建一个项目,打开【项目属性】对话框,选择【VC++目录】,在【包含目录】中增加我们下载下来的源码的头文件存放的位置,相对路径为:redis-win-3.2.100\src 和 \redis-win-3.2.100\deps\hiredis。这两个文件夹里包含了hiredis需要使用的头文件和c文件。
在【库目录】中选择我们静态链接库存放的位置\redis-win-3.2.100\msvs\x64\Debug
在【链接器】>>【输入】中,选择【附加依赖项】,在其中增加之前编译的链接库文件hiredis.lib,Win32_Interop.lib,用回车来分割即可。这样就配置好了.
补充:调用的项目配置属性c/c+±->代码运行–>MTD,(因为hiredis默认属性是mtd)
redis 订阅者
#include
#include
#include
#include “hiredis\hiredis.h”
using namespace std;
int main()
{
//1、连接Redis服务器
redisContext *context = redisConnect(“127.0.0.1”, 6379);
if (context->err)
{
std::cout << “can not connect to redisserver: 127.0.0.1,port:6379” << endl;
std::cout << “reason:” << context->errstr << endl;
redisFree(context);
context = NULL;
return 0;
}
//2、校验密码
char *auth = "test123";
redisReply *reply = (redisReply *)redisCommand(context, "AUTH %s", auth);
if (NULL == reply)
{
std::cout << "wrong password!" << endl;
freeReplyObject(reply);
redisFree(context);
context = NULL;
return 0;
}
freeReplyObject(reply);
//3、选择数据库 - 不选择也可
reply = (redisReply *)redisCommand(context, "SELECT %d", 1);
if (NULL == reply || REDIS_REPLY_ERROR == reply->type)
{
std::cout << "select failed!" << endl;
freeReplyObject(reply);
redisFree(context);
context = NULL;
return 0;
}
std::cout << "subscribe redischat!" << endl;
//4、订阅消息 可以订阅多个消息 PSUBSCRIBE pattern
reply = (redisReply *)redisCommand(context, "SUBSCRIBE %s", "redischat");
if (NULL == reply||reply->type != REDIS_REPLY_ARRAY)//订阅成功返回一个数组标识
{
std::cout << "subscribe failed!" << endl;
freeReplyObject(reply);
redisFree(context);
context = NULL;
return 0;
}
freeReplyObject(reply);
//5、阻塞等待订阅消息
while (true)
{
void *_reply = nullptr;
if (redisGetReply(context, &_reply) != REDIS_OK)
{
continue;
}
reply = (redisReply*)_reply;
for (int nIndex = 0; nIndex < reply->elements; nIndex++)
{
std::cout << nIndex + 1 << ")";
std::cout << reply->element[nIndex]->str << std::endl;
}
freeReplyObject(reply);
std::cout << "***************" << std::endl;
}
redisFree(context);
context = NULL;
return 0;
}
redis发布者
#include
#include
#include
#include “hiredis\hiredis.h”
using namespace std;
int main()
{
//1、连接服务器
redisContext *context = redisConnect(“127.0.0.1”, 6379);
if (context->err)
{
std::cout << “can not connect to redisserver: 127.0.0.1,port:6379” << endl;
std::cout << “reason:” << context->errstr << endl;
redisFree(context);
context = NULL;
return 0;
}
//2、校验密码
char *auth = "test123";
redisReply *reply = (redisReply *)redisCommand(context, "AUTH %s", auth);
if (NULL == reply)
{
std::cout << "wrong password!" << endl;
redisFree(context);
context = NULL;
return 0;
}
freeReplyObject(reply);
//3、选择数据库
reply = (redisReply *)redisCommand(context, "SELECT %d", 1);
if (NULL == reply || REDIS_REPLY_ERROR == reply->type)
{
std::cout << "select failed!" << endl;
redisFree(context);
context = NULL;
return 0;
}
std::cout << "publish redischat!" << endl;
//4、推送消息
while (true)
{
std::string Message;
char s[1024];
memset(s, 0, 1024);
cin >>s;
Message.append(s);
reply = (redisReply *)redisCommand(context, "publish %s %s", "redischat", Message.c_str());
if (NULL == reply || reply->type != REDIS_REPLY_INTEGER)//成功推送几个就会有几个 integer
{
break;
}
freeReplyObject(reply);
}
if (reply!=NULL)freeReplyObject(reply);
redisFree(context);
context = NULL;
return 0;
}
#endif