windows下hiredis使用

 

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; 
“`

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值