Windows下redis环境搭建(可查看源码及Debug调试进入源码)及简易使用

即可Debug调试进入源码环境,也可F12跳转到对应redis的API实现)并进行简单使用的步骤。

参考文章及资源地址:

http://c.biancheng.net/redis/windows-installer.html

https://github.com/tporadowski/redis/releases

https://github.com/microsoftarchive/redis

效果

redis设置对外开放 redis开发环境_缓存

导出redis Lib库

TIPS:redis环境搭建需要两个lib库,分别为hiredis.lib、Win32_Interop.lib。

Win32_Interop.lib

  首先使用Visual Studio 2017新建一个空项目,如下:

redis设置对外开放 redis开发环境_缓存_02


redis设置对外开放 redis开发环境_缓存_03

  然后从GitHub官网上下载redis源码,如下:

下载链接:https://github.com/microsoftarchive/redis

redis设置对外开放 redis开发环境_服务端_04

redis设置对外开放 redis开发环境_redis设置对外开放_05


redis设置对外开放 redis开发环境_缓存_06

redis设置对外开放 redis开发环境_redis_07

配置一个既可查阅源代码又可Debug调试的环境。故进行如下步骤:

  回到我们新建的空项目,在Test解决方案下新建一个子项目Win32_Interop,如下:

redis设置对外开放 redis开发环境_缓存_08

  注意,这里将调试环境改为x64,我们基于x64环境配置:

redis设置对外开放 redis开发环境_redis设置对外开放_09

  下面将需要的源码引入至子项目Win32_Interop中,配置如下:

  在sln文件目录下新建一个3rd文件夹。

redis设置对外开放 redis开发环境_windows_10

  在3rd文件夹下新建一个include文件夹。

redis设置对外开放 redis开发环境_服务端_11

  在include文件夹下引入redis源码中的以下部分:

redis设置对外开放 redis开发环境_windows_12

  结果如下:

redis设置对外开放 redis开发环境_redis设置对外开放_13

  在子项目Win32_Interop中引入我们3rd/include/src/Win32_Interop下面的所有源码(不包括resources文件夹),如下:

redis设置对外开放 redis开发环境_redis设置对外开放_14


redis设置对外开放 redis开发环境_缓存_15

  接下来需要配置子项目Win32_Interop的属性面板,这里需要参考文章:进行快速配置。

  编辑子项目Win32_Interop下的vcxproj文件。

redis设置对外开放 redis开发环境_windows_16

  打开redis源码中子项目Win32_Interop下的vcxproj文件。

redis设置对外开放 redis开发环境_缓存_17


redis设置对外开放 redis开发环境_redis_18

  复制redis源码子项目Win32_Interop下的vcxproj文件从<PropertyGroup Label=“Globals”>开始的所有配置信息替换我们子项目Win32_Interop下的vcxproj文件从<PropertyGroup Label=“Globals”>开始的所有配置信息,然后保存文件即可。

  这里我们进入我们子项目Win32_Interop,会提示如下信息,覆盖即可。

redis设置对外开放 redis开发环境_redis_19

  这时我们再看我们的子项目会发现我们之前引入的源码消失了,这里只需再次引入即可。

redis设置对外开放 redis开发环境_redis_20

TIPS:这里博主出现失误,只需按照之前的源码引入步骤重新引入即可。

redis设置对外开放 redis开发环境_windows_21

  右键生成这个子项目。

redis设置对外开放 redis开发环境_windows_22

  这里抛出一个错误,原因是子项目无法找到该文件,故在3rd文件夹下新建一个src文件夹引入redis源码库,如下:

redis设置对外开放 redis开发环境_服务端_23

  将整个redis源码都复制至3rd/src下。

redis设置对外开放 redis开发环境_服务端_24


redis设置对外开放 redis开发环境_缓存_25

  然后我们配置子项目Win32_Interop的属性面板,如下:

redis设置对外开放 redis开发环境_redis_26


redis设置对外开放 redis开发环境_windows_27

  将附加库目录的文件路径改为我们3rd/src/redis-3.0下的文件对应目录即可。

redis设置对外开放 redis开发环境_服务端_28

  然后右键子项目生成即可。

redis设置对外开放 redis开发环境_redis设置对外开放_29

  此时,Win32_Interop.lib已经生成。可以通过生成路径查看,如下:

redis设置对外开放 redis开发环境_缓存_30


redis设置对外开放 redis开发环境_缓存_31

hiredis.lib

  下面我们再次新建一个子项目hiredis,如下:

redis设置对外开放 redis开发环境_redis设置对外开放_32

  将3rd/src/redis-3.0/deps/hiredis下的源码引入至子项目hiredis中,如下(引入的文件可参考图中所示):

redis设置对外开放 redis开发环境_缓存_33

  配置一下子项目hiredis的属性面板,如下:

redis设置对外开放 redis开发环境_windows_34


redis设置对外开放 redis开发环境_服务端_35


redis设置对外开放 redis开发环境_缓存_36

_OFF_T_DEFINED
WIN32
_LIB
_DEBUG
_CRT_SECURE_NO_WARNINGS

  最后右键属性生成即可。

redis设置对外开放 redis开发环境_windows_37


redis设置对外开放 redis开发环境_redis设置对外开放_38

简易应用

  紧接着配置子项目Test,先新建一个main.cpp文件,然后配置子项目Test的属性面板。

redis设置对外开放 redis开发环境_redis_39

  将导出的lib库放入3rd/lib文件夹下,如下:

redis设置对外开放 redis开发环境_windows_40


redis设置对外开放 redis开发环境_redis_41

  再次配置子项目Test的属性面板,如下:

redis设置对外开放 redis开发环境_windows_42


redis设置对外开放 redis开发环境_缓存_43

hiredis.lib
Win32_Interop.lib

  最后,在main.cpp中编辑如下简单应用代码,右键生成即可。

#include <iostream>
#include "hiredis.h"
using std::cout;
using std::endl;
using std::cin;

int main() {
    redisContext* c = redisConnect("127.0.0.1", 6379);
    if (c->err) {
        cout << "Connect to redisServer faild " << c->errstr << endl;
        redisFree(c);
        return 0;
    }
    cout << "Connect to redisServer Success" << endl;

    //为redis 设置key
    const char* command1 = "set stest1 goodgoodgoodgood";

    //执行redis命令行
    redisReply* ret = (redisReply*)redisCommand(c, command1);
    //如果返回为NULL,标识执行失败
    if (NULL == ret) {
        cout << "Exec command1 faile" << endl;
        redisFree(c);
        return 0;
    }

    //如果执行失败则释放连接
    if (!(ret->type == REDIS_REPLY_STATUS &&
        (strcmp(ret->str, "OK") == 0 || strcmp(command1, "ok") == 0))) {
        cout << "Failed to exec command " << command1 << endl;
        freeReplyObject(ret);
        redisFree(c);
        return 0;
    }

    //执行成功,释放redisCommand执行后的返回对象redisReply所占用的空间
    freeReplyObject(ret);
    ret = nullptr;
    cout << "Succeed to exec command " << command1 << endl;

    command1 = "strlen stest1";
    ret = (redisReply*)redisCommand(c, command1);
    //如果返回类型不是整型,那么释放连接
    if (ret->type != REDIS_REPLY_INTEGER) {
        cout << "Failed to exec command " << command1;
        freeReplyObject(ret);
        redisFree(c);
        return 0;
    }

    //获取字符串长度
    int length = ret->integer;
    freeReplyObject(ret);
    ret = nullptr;
    cout << "The length of 'stest1' is " << length << endl;
    cout << "Succeed to exec command " << command1 << endl;

    //获取redis键值对信息
    command1 = "get stest1";
    ret = (redisReply*)redisCommand(c, command1);
    if (ret->type != REDIS_REPLY_STRING) {
        cout << "Failed to exec command " << command1;
        freeReplyObject(ret);
        redisFree(c);
        return 0;
    }
    cout << "The Value of 'stest1' is " << ret->str << endl;
    freeReplyObject(ret);
    ret = nullptr;
    cout << "Succeed to exec command " << command1 << endl;

    //test
    command1 = "get stest2";
    ret = (redisReply *)redisCommand(c, command1);
    if (ret->type == REDIS_REPLY_NIL) {
        printf("Failed to execute command[%s]\n", command1);
        freeReplyObject(ret);
        redisFree(c);
        return 0;
    }
    freeReplyObject(ret);
    ret = nullptr;
    printf("Succeed to execute command[%s]\n", command1);

    //释放连接资源
    redisFree(c);
    return 0;
}

redis设置对外开放 redis开发环境_windows_44

  如果测试呢?只需下载redis服务器本地局域网内运行即可。下载链接:https://github.com/tporadowski/redis/releases

redis设置对外开放 redis开发环境_windows_45

  运行redis-server.exe,然后再运行我们的Test子项目即可测试。

redis设置对外开放 redis开发环境_redis_46


redis设置对外开放 redis开发环境_redis设置对外开放_47

  运行结果:

redis设置对外开放 redis开发环境_redis设置对外开放_48

注意点

三个子项目中运行库都必须为多线程调试DLL(/MDd)模式,否则生成会出错。

redis设置对外开放 redis开发环境_redis_49