文章目录

  • 简介
  • 一、找到要使用的开源库
  • 二、`VS2019`编译`hiredis`
  • 三、`VS2019`编译`redis-plus-plus`
  • 四、测试库
  • 五、本文解决方案下载
  • win_redis.7z


简介

一、找到要使用的开源库

为了测试在VS2019下用c++开发的客户端代码,可以选择一款官方推荐的c++客户端开源库。

先去官方的客户端主页看看:https://redis.io/clients#c-plus-plus

看到如下信息:

C操作redis c++实现redis_C操作redis

找到c++客户端中看看有没有这个标志的。

C操作redis c++实现redis_#include_02

找到唯一一个:redis-plus-plus

点那个树杈形状的链接,浏览到redis-plus-plusgithub主页,看到这个:

C操作redis c++实现redis_解决方案_03

要求hiredis v0.12.1以上的版本,推荐最终发布的稳定版。

要先搞定hiredisvs2019的编译!

之前Windows搭建redis服务器的时候(参见文章搭建windows下redis哨兵模式和搭建windows下简易的redis集群环境),留意过Redis-x64-5.0.10 for Windows版本,上面是有源码的,里面也包含了hiredis

源码的下载地址是:https://github.com/tporadowski/redis/releases

C操作redis c++实现redis_C操作redis_04

Redis-x64-5.0.10 for Windowsredis-plus-plus都下载下来。

C操作redis c++实现redis_C操作redis_05

二、VS2019编译hiredis

新建目录win_redisredis-5.0.10.zip解压到目录中。

C操作redis c++实现redis_redis_06

里面的msvc目录直接有vs的sln文件,用vs2019打开这个解决方案文件。

C操作redis c++实现redis_C操作redis_07

我们目的是只想编译hiredis,得到库文件。可执行文件redis-server.exeredis-cli.exe直接下载Redis-x64-5.0.10.zip就有了,可以不编译。

而且打开hiredis.h文件,看到版本号是0.13,满足redis-plus-plus要求的hiredis v0.12.1以上的版本。

干脆把整个工程都编译一下吧!

编译过程问题解决:(如果只编译hiredis库则不会有问题)

  • 编译问题1
\win_redis\redis-5.0.10\src\release.c(44,10): fatal error C1083: 无法打开包括文件: “release.h”: No such file or directory

解决:参考redis-3.0.ziprelease.c,改一下源代码:

在文件开头

#include <string.h>

#include "release.h"
#include "version.h"
#include "crc64.h"

改为:

#ifdef _WIN32
#include "Win32_Interop/Win32_Portability.h"
#define REDIS_GIT_SHA1 "00000000"   /* TODO: Modify build to write them to release.h from the environment */
#define REDIS_GIT_DIRTY "0"
#define REDIS_BUILD_ID "0000"
#endif

#include <string.h>

POSIX_ONLY(#include "release.h")
#include "version.h"
#include "crc64.h"

重新编译项目,出现问题2。

  • 编译问题2

这个问题可以不管,编译已经成功了。

C操作redis c++实现redis_解决方案_08

如果要解决:关闭VS2019,右键菜单,然后用管理者模式打开VS2019,打开解决方案,编译通过。

或者设置一下:

C操作redis c++实现redis_#include_09

之后编译成功。

为了项目开发业务程序方便引用库,可以设置项目生成的库文件都输出到msvclib目录,exe文件都输出到msvcbin目录中。

libhiredis项目为例,设置是:

C操作redis c++实现redis_redis_10

exe项目以RedisServer项目设置为例,设置是:

C操作redis c++实现redis_#include_11

C操作redis c++实现redis_#include_12

重新编译成功,看到lib文件都输出到msvclib目录,exe文件都输出到msvcbin目录中

C操作redis c++实现redis_解决方案_13

C操作redis c++实现redis_redis_14

三、VS2019编译redis-plus-plus

redis-plus-plusCMAKE的项目,VS2019本来支持直接打开文件夹的方式编译CMAKE项目的,但是我试了这个项目,虽然可以直接编译出lib文件,但是没有产生VS2019的工程文件。

所以直接下载最新的CMAKE安装,然后配置、产生VS2019的项目文件,再用VS2019打开项目文件编译。

从https://cmake.org/download/下载CMAKE最新版本cmake-3.19.1-win64-x64.msi

C操作redis c++实现redis_C操作redis_15

安装时,加入到环境变量中,安装完成后,就可以操作redis-plus-plus

首先下载的redis-plus-plus-master.zip解压到win_redisdeps目录,和hiredis放到同一级别目录中,如下图。

C操作redis c++实现redis_解决方案_16

启动CMAKE,操作这个目录。

如下图设置:

C操作redis c++实现redis_解决方案_17

源文件目录选择deps中的redis-plus-plus-master目录;build目录选择在msvc中新建的redis-plus-plus-master目录;然后点击Configure按键,弹出的界面如下图配置。

C操作redis c++实现redis_C操作redis_18

Finish之后,出现错误提示,不管它,修改配置界面,如下图:

Debug;Release;MinSizeRel;RelWithDebInfo改为Debug;Release

C操作redis c++实现redis_redis_19

然后点Configure按键,注意,每点击1次都会提示错误,但是界面都会有变化,错误之后再点击Configure按键,我是重复了7、8次之后,出现了如下的界面:

C操作redis c++实现redis_解决方案_20

配置HIREDIS_HEADER、HIREDIS_STATIC_LIB,配置到上面编译好的hiredis的头文件和库文件夹中,SHARED库、TESTTLS都不勾选,然后再点Configure按键,如下图。

C操作redis c++实现redis_C操作redis_21

然后Generate按键生成VS项目。目录中能看到解决方案和项目文件了,如下图:

C操作redis c++实现redis_解决方案_22

在之前编译hiredis的解决方案中,增加这个存在的redis-plus-plus-static.vcxproj项目,如下图:

C操作redis c++实现redis_解决方案_23

VS2019中修改配置,因为CMAKE配置头文件和库的时候使用了绝对路径,可以修改成使用VS的环境变量,目录搬移时也可以兼容,如下图:

C操作redis c++实现redis_解决方案_24

C操作redis c++实现redis_C操作redis_25

C操作redis c++实现redis_解决方案_26

注意:这里运行库用MTd是因为,之前的编译hiredis的项目用了MT或者MTd的,所以要一致。

C操作redis c++实现redis_#include_27

编译成功!

四、测试库

解决方案中新建项目redis++_demo,注意运行库设置也要是MTd或者MT的,头文件要包含hiredisredis-plus-plus的头文件,要连接库文件hiredis.libredis++.libWin32_Interop.lib

源代码如下:

#include <sw/redis++/redis++.h>
#include <iostream>
#include <cstdio>
#include <unordered_set>
#include <Windows.h>

using namespace sw::redis;

int main(int argc, char** argv)
{
	try {
		Redis redis = Redis("tcp://127.0.0.1:6379");

		redis.set("key", "Test redis-cplus-cplus");
		OptionalString val = redis.get("key"); 
		if (val) {
			std::cout << *val << std::endl;
		}
	}
	catch (const Error& e) {

	}
	return 0;
}

先执行redis-server.exe服务,端口使用默认的6379,编译这个程序并执行后,结果如下:

C操作redis c++实现redis_C操作redis_28

五、本文解决方案下载