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

news2024/11/13 8:00:55

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

  在我们使用redis进行学习的过程中,在Windows平台上进行学习是一个非常高效的选择,因此下面介绍如何在Windows环境下搭建一个redis环境(即可Debug调试进入源码环境,也可F12跳转到对应redis的API实现)并进行简单使用的步骤。

参考文章及资源地址:

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

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

https://blog.csdn.net/RYIJU5YUJTY/article/details/125129462

https://blog.csdn.net/RYIJU5YUJTY/article/details/125129558

https://blog.csdn.net/iamohenry/article/details/105789333

https://github.com/microsoftarchive/redis

效果

效果图

导出redis Lib库

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

Win32_Interop.lib

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

效果图
效果图

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

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

效果图

效果图
效果图

效果图

  此时我们已经可以导出redis的lib库,只需将hiredis、Window32_Interop两个项目生成即可生成相应的Lib库,而关于一个项目如何引入Lib与Visual Studio通常的引入方式相同,这里不做过多阐述。由于我们处于学习阶段,我们需要配置一个既可查阅源代码又可Debug调试的环境。故进行如下步骤:

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

效果图

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

效果图

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

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

效果图

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

效果图

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

效果图

  结果如下:

效果图

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

效果图
效果图

  接下来需要配置子项目Win32_Interop的属性面板,这里需要参考文章:https://blog.csdn.net/iamohenry/article/details/105789333进行快速配置。

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

效果图

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

效果图
效果图

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

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

效果图

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

效果图

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

效果图

  右键生成这个子项目。

效果图

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

效果图

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

效果图
效果图

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

效果图
效果图

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

效果图

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

效果图

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

效果图
效果图

hiredis.lib

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

效果图

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

效果图

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

效果图
效果图
效果图

_OFF_T_DEFINED
WIN32
_LIB
_DEBUG
_CRT_SECURE_NO_WARNINGS

  最后右键属性生成即可。
效果图
效果图

简易应用

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

效果图

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

效果图
效果图

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

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服务器本地局域网内运行即可。下载链接:https://github.com/tporadowski/redis/releases

效果图

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

效果图
效果图

  运行结果:

效果图

注意点

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

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之入门二叉树

文章目录前言1.二叉树的知识铺垫2.二叉树的具体实现1.递归实现前中后序遍历2.其它相关接口的实现1.求二叉树的节点个数2.求叶子节点个数3.二叉树查找值为x的节点3.求树高度4.求k层节点的个数5.层序遍历6.判断二叉树是否是完全二插树3.总结前言 之前用数组实现了一种特殊的完全…

解决word写论文改成两栏时mathtype的公式无法居中的问题

想要的格式 投论文的时候&#xff0c;有很多期刊的要求是两栏排版&#xff0c;比如中国电机工程学报 理论上&#xff0c;用mathtype输入的公式&#xff0c;会根据word的格式自动地调整自己的缩进量&#xff08;更确切地说&#xff0c;是会自动调整制表位&#xff09;。比如下…

新手入门指南之玩转蓝桥云课(线上运行虚拟机,c++,Java,Javaweb,python环境,以及如何成功利用命令行运行这些环境)

目录 你好&#xff0c;蓝桥云课 &#x1f44b; &#x1f332;欢迎来到蓝桥云课&#x1f332; 为什么要用 Linux 实验精神 蓝桥云课课程 加入课程 开始实验 实验环境 讨论发帖 实验报告 有效学习时间 我们的目标是星辰大海 &#x1f350;Linux 桌面环境使用指南&…

【C++ Primer】阅读笔记(4):string

目录 简介初始化string对象初始化方法直接初始化与拷贝初始化string对象上的操作操作方式读取string对象(cin>>s、cout<<s)getline(is,s)empty()size()string对象的比较(>、<、<=、>=)两个string对象相加(s1+s2)字面值与string对象相加遍历string对象参…

Jenkins复制和导出导入job

一、同一个Jenkins中复制job如果是同一个Jenkins复制job&#xff0c;只需要在创建Job时&#xff0c;选择Copy from一个已有的job即可。也就是在下方上面的红框中输入你新建job的名称&#xff0c;在下面的红框中输入你想要复制的job(已经建好的job)&#xff0c;然后点击确定。这…

【C初阶】实用调试技巧

实用调试技巧前言一、什么是bug&#xff1f;二、调试是什么&#xff1f;&#xff08;一&#xff09;调试&#xff08;二&#xff09;调试的基本步骤&#xff08;三&#xff09;Debug和Release的介绍。1.简单介绍三、Windows环境调试介绍&#xff08;一&#xff09;调试环境的准…

【SAP Abap】SAP ALV开发(REUSE_ALV_GRID_DISPLAY_LVC)全网最详细 DEMO

SAP ALV开发&#xff08;REUSE_ALV_GRID_DISPLAY_LVC&#xff09;全网最详细 DEMO1、ALV 简介2、演示程序1、ALV 简介 ALV 报表程序&#xff0c;是我们在 SAP 项目中最常开发的程序类型。 SAP 系统提供了三种 ALV 实现方式&#xff0c;分别是&#xff1a; FM ALV&#xff0c;…

win10下安装多个JDK配置方法

环境变量配置 此电脑 --- 属性 -- 高级系统设置 -- 环境变量 -- 系统变量 -- 新建 1、配置JAVA_HOME JAVA6_HOME jdk1.6的安装路径 JAVA8_HOME jdk1.8的安装路径 JAVA_HOME %JAVA8_HOME% 两个%表示引用变量的值&#xff0c;直接用JAVA_HOME&#xff0c;就能表示一连串长…

SAR影像变化检测方法之(SAR_CD_DDNet(无监督变化检测))论文阅读

一、论文信息 1、论文标题&#xff1a;Change Detection in Synthetic Aperture Radar Images Using a Dual-Domain Network 2、代码链接&#xff1a;https://github.com/summitgao/SAR_CD_DDNet 二、摘要 合成孔径雷达(SAR)图像的变化检测是一项关键而具有挑战性的任务。现…

Android---BottomAppBar

目录 BottomAppBar FloatingActionButton UI 完整代码 BottomAppBar Material Design 的一个重要特征是设计 BottomAppBar 。可适应用户不断变化的需求和行为。因此&#xff0c;BottomAppBar 是一个从标准物质指导的演变。它更注重功能&#xff0c;增加参与…

ansible 第三天

1.挂载本地光盘到/mnt 2.配置yum源仓库文件通过多种方式实现 仓库1 &#xff1a; Name: RH294_Base Description&#xff1a; RH294 base software Base urt: file:///mnt/BaseOS 不需要验证钦件包 GPG 签名 启用此软件仓库 仓库 2: Name: RH294_Stream Description &#xff1…

Android Studio 用WIFI无线调试adb (3种方法)

最近数据线一直被boss借走&#xff0c;一旦借走就无法调试了&#xff0c;所以就打算不用数据线调试了&#xff0c;使用WIFI进行调试。 一、命令 1、首先配置adb环境变量 首先找到andoridSDK的路径中的platform-tools文件夹 &#xff0c;将他的路径复制我的是 C:\Users\YiShi…

365天深度学习训练营-第P7周:YOLOv5-Backbone/YOLOv5-C3模块实现

目录 一、前言 二、我的环境 三、代码实现 1、C3模块 2、Backbone模块 一、前言 >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/xLjALoOD8HPZcH563En8bQ) 中的学习记录博客** >- **&#x1f366; 参考文章&#xff1a;36…

【算法】day03:动态规划dp

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录1. 青蛙跳台阶2. 矩形覆盖3. 二进制中1的个数4. 链表中倒数第k个结点普通小孩也要热爱生活&#xff01; 1. 青蛙跳台阶 跳台阶 1&#xff09;思路&#xff1a;如果青蛙在第n个台阶上&#xff0c;那么它要么来自n-1…

python命名规范

1.命名有字母、数字和下划线三个组成 2.项目名、包名、模块名、python文件名 都应该用英文开头&#xff0c;不能纯数字&#xff0c;否则无法识别 3.脚本名不能跟系统模块或三方模块重复 4.函数、类、方法、参数名称不能跟系统现有名称重复 5.类名必须以大写字母开头、除了类…

Kafka在windows下下载、启动、测试详细教程

目录 下载地址 启动 启动zookeeper 启动kafka 队列操作 创建消息队列名 删除消息队列名 查看所有的队列 测试 生产测试 消费测试 下载地址 Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/downloadswindows下kafka3.0版本的…

G120系列变频器进行参数备份(上传或下载)的2种基本方法介绍(Startdrive+SD卡)

G120系列变频器进行参数备份(上传或下载)的2种基本方法介绍(Startdrive+SD卡) 1. 通过SINAMICS SD存储卡对G120系列变频器进行参数上传/下载的具体方法 适配范围:CU240B-2(DP)/CU240E-2(DP/PN)/CU250S-2(DP/PN) 可将变频器的参数设置保存至 SINAMICS SD 卡。在进行变频器更…

回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入多输出

回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入多输出 目录回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入多输出预测效果基本介绍程序设计往期精彩参考资料预测效果 基本介绍 MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入多输出&#xff0c;运行…

docker swarm 集群部署和验证

docker swarm可以轻松的部署集群,实现负载均衡,服务器的扩容和扩容的反义词. 首先docker的官方文档非常的不稳定,梯子也不解决问题.还好有替代 docs.docker.com 用不了 https://docs.docker.com.zh.xy2401.com/engine/swarm/swarm-tutorial/ 很好 场景: 三台机器 x.x.x.104 x.…

经典文献阅读之--FAST-LIVO(Fast-LIO系列的激光视觉惯性里程计)

0. 简介 在此之前博主对Fast-LIO2和R3LIVE进行了系统性的学习。最近文章《Fast and Tightly-coupled Sparse-Direct LiDAR-Inertial-Visual Odometry》提出了FAST-LIVO&#xff0c;这是一种快速LiDAR惯性-视觉里程计系统&#xff0c;它建立在两个紧耦合的直接里程计子系统之上…