windows下hiredis使用

来源:互联网 发布:云计算标准和应用大会 编辑:程序博客网 时间:2024/06/07 05:58
 

hiredis相关库的介绍就不做详细说明了,搜索就可以找到更加详细的说明。 此篇文章主要是介绍hiredis的使用,以及本人在使用时遇到的问题和解决办法。

首先下载安装windows redis server. 可以参考 
http://my.oschina.net/lujianing/blog/204103。 里面介绍的还是挺详细的。

其次下载hiredis相关文件及静态库,地址为:http://pan.baidu.com/s/1kUkiBw7 
里面包含了win32fixes.h,win32fixes.c, hiredis.lib,和使用到的头文件redis文件夹。

使用: 
1. 连接redis函数: redisContext *redisConnect(const char *ip, int port); 
2. 链接成功后,就可以开始执行各种命令了,执行命令的函数: void *redisCommand(redisContext *c, const char *format, …); 
然后就可以通过redisCommand执行各类命令了,常用的命令有: 
AUTH “redispwd” //授权认证密码。 如果redis设置了密码,只有认证成功后才可以执行其他命令 
SET “key” “value” //设置key,value到redis 
GET “key” //通过key去Get对应的value 
… 
等等命令都可以通过这个函数执行。 
3. 释放redisCommand函数返回的redisReply结构体:void freeReplyObject(void *reply);

遇到的问题: 
1.遇到如下问题,解决办法是添加 #pragma comment(lib, “ws2_32.lib”), 
kRedis.obj : error LNK2001: 无法解析的外部符号 __imp__WSAStartup@8 
1>win32fixes.obj : error LNK2001: 无法解析的外部符号 __imp__WSAStartup@8 
1>win32fixes.obj : error LNK2001: 无法解析的外部符号 __imp__setsockopt@20 
1>hiredis.lib(hiredis.obj) : error LNK2001: 无法解析的外部符号 __imp__send@16 
1>hiredis.lib(hiredis.obj) : error LNK2001: 无法解析的外部符号 __imp__closesocket@4 
1>hiredis.lib(hiredis.obj) : error LNK2001: 无法解析的外部符号 __imp__recv@16 
1>hiredis.lib(hiredis.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__getsockopt@20 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__gethostbyname@4 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 ___WSAFDIsSet@8 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__socket@12 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__htons@4 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__select@20 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__inet_addr@4 
1>hiredis.lib(net.obj) : error LNK2001: 无法解析的外部符号 __imp__connect@12 
1>hiredis.lib(net.obj) : error外部符号 __imp__ioctlsocket@12`

注意的是记得初始化ws2_32库。 否则会连不上redis

WSADATA wsaData;WSAStartup(MAKEWORD(2,1), &wsaData);int timeout = 10000;struct timeval tv;tv.tv_sec = timeout /1000;tv.tv_usec

2.问题如下, 解决办法: 工程->属性->C/C++->预编译头->预编译头关闭。 
1>*\win32fixes.c : fatal e,或者预编译编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)编+ 而在 C 中使用它(或相反)

完整流程: 
1.创建你的项目 
2.将win32fixes.h,win32fixes.c加入到你的项目中 
3.将工程的预编译头关闭 
4.在使用的地方加上如下代码 
#include “redis/hiredis.h” 
#pragma comment(lib, “ws2_32.lib”) 
#pragma comment(lib,”hiredis.lib”) 
5.初始化时,初始化ws2_32。 
6.执行redisConnect 
7.随心所欲执行redisCommand

上代码:

#include "stdafx.h"#include "redis/hiredis.h"#include <stdio.h>#include <stdlib.h>#include <string>#pragma comment(lib, "ws2_32.lib")#pragma comment(lib,"hiredis.lib")int _tmain(int argc, _TCHAR* argv[]){    std::string redisip = "127.0.0.1";    unsigned int redisport = 6379;    std::string redispwd = "redispwd";  //redis密码    //初始化ws2_32库    WSADATA wsaData;    WSAStartup(MAKEWORD(2,1), &wsaData);    int timeout = 10000;    struct timeval tv;    tv.tv_sec = timeout /1000;    tv.tv_usec = timeout *1000;    redisContext *m_redis_set_context = redisConnect(redisip.c_str(), redisport);    if(m_redis_set_context && m_redis_set_context->err)    {        printf("redisConnect failed \n");        return 0;    }    //如果redis设置了密码则需要。    redisReply* reply= (redisReply*) redisCommand(m_redis_get_context, "AUTH %s", redispwd.c_str());     if (reply->type == REDIS_REPLY_ERROR) {         printf("Redis Authentication failed !!!! \n");        return 0;    }     freeReplyObject(reply);    reply = (redisReply*)redisCommand(redis_set_context, "SET CheckRedis %s", get_date_time().c_str());    if(reply)    {        printf("set successful \n");    }    freeReplyObject(reply);    reply = (redisReply*)redisCommand(redis_get_context, "GET CheckRedis");    if(!reply)    {        printf("get failed \n");        freeReplyObject(reply);        return -1;    }    if (reply->type != REDIS_REPLY_STRING)    {        printf("get failed \n");        freeReplyObject(reply);        return -1;    }    std::string s = reply->str;    printf("get successful! s = %s \n", s->c_str());    freeReplyObject(reply);    return 0;}

= timeout *1000; 
“`

原创粉丝点击