在Windows上,使用msys2能够编译最新版的Redis,今天我就来分享一下编译的过程。
Msys2和Cygwin类似,都是在Windows下可以执行Linux命令并编译Linux软件的环境。
1,下载安装Msys2并配置镜像源
去官网下载并安装Msys2,安装过程很简单,这里就不再赘述安装过程了。

默认安装在C:\msys64目录下,安装完成后,打开安装目录下的msys2.exe即可打开Msys2控制台,这个文件就是其主程序,可以创建一个快捷方式到桌面。

首先我们要更换Msys2的软件源,使其下载速度更快,我们更换清华的源,打开Msys2的控制台,执行下列命令换源:
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
然后执行命令更新所有包:
pacman -Syu
按照控制台中的英文提示完成更新系统即可。
第一次更新后可能会提示关闭Msys2重启,确认后控制台会被关闭,但这时没有完全更新完毕,需要重新打开控制台再执行更新命令,重复操作直到全部最新为止。
2,安装编译Redis必要的软件包
打开Msys2控制台,执行以下命令安装编译所需的相关工具:
pacman -S gcc make pkgconf openssl-devel
安装完成后,我们还需要修改Msys2中的一个库文件,否则编译Redis的时候会报错找不到符号Dl_info。
用文本编辑器打开Msys2安装目录下的usr/include/dlfcn.h这个文件,找到49行这个位置,如下图,将49行#if __GNU_VISIBLE和61行的#endif这两行内容删掉,保存。(建议修改之前先备份这个文件)

3,编译Redis
(1) 下载Redis源码
去Redis官网下载源代码并解压(备用下载,提取码:2333):
划到网页最下面,找到Additional download options并展开Install from source如下:
点击最新稳定版链接下载:
然后进行解压缩即可。
此外,历史版本可以到官方Github仓库的Releases中下载:传送门
(2) 修改hiredis库的sds.h和sds.c源码
如果你编译的是
7.0.15及其以下版本的Redis源码,这可以跳过这一步。
在7.2版本及其以上的Redis中,如果现在直接编译可能会报下列错误并编译失败:
error: array subscript has type ‘char’ [-Werror=char-subscripts]
这是由于在编译其中附带的hiredis库时其中的代码尝试使用 char 类型的值作为数组下标导致,我们需要修改其源码的函数定义,将char类型改成无符号的。
首先找到源码目录中的deps/hiredis/sds.h头文件,找到第255行的hisds hi_sdscatrepr函数声明如下:
修改其第2个参数为const unsigned char *p,最终如下:
然后找到源码目录中deps/hiredis/sds.c源文件,找到第875行的hisds hi_sdscatrepr函数实现如下:
同样修改其第2个参数为const unsigned char *p,最终如下:
(3) 编译源码
在Msys2控制台中,使用cd命令进入到解压后Redis源码所在目录下:
cd "源码目录"
需要注意的是,在Msys2中路径要以Linux形式表示,而不是Windows路径,命令中路径都要用英文双引号包围,下面的命令中路径也是一样。
比如说我的Redis源码解压后位于C:\Users\swsk33\Downloads\redis-stable目录下,那就要通过下列命令进入:
cd "/c/Users/swsk33/Downloads/redis-stable"
也就是说将盘符例如C:替换成/c的形式,然后把\替换成/即可。
进入目录后然后开始编译:
export BUILD_TLS=yes
make -j $(nproc)
最后出现Hint: It's a good idea to run 'make test' ;)说明编译成功。

如果编译出现问题,可执行下列命令清理编译产物后重新编译:
make distclean
(4) 提取可执行文件
再通过以下命令把二进制可执行文件提取出来:
make PREFIX="要提取到的路径" install
例如我:
make PREFIX="/c/Users/swsk33/Downloads/redis-binary" install
然后在指定目录中就出现了bin文件夹,这个文件夹中就是编译好了的Redis的Windows二进制文件,可以直接执行。
不过直接打开会提示找不到dll的错误:

这时我们只需要在Msys2的安装目录中的usr/bin目录下,找到msys-2.0.dll这个文件,复制一个到我们Redis已编译的二进制exe文件同目录下,即可直接运行了:

现在,将这个Redis的exe文件所在目录加入Path环境变量,即可使用命令行调用Redis的命令了!
4,Windows添加Redis服务端开机自启
如果你仅仅是想连接已有的远程Redis服务端,就可以不用看这一部分!
为了方便起见,我们可能需要编译完成之后,在本地运行Redis服务端以进行我们平时开发测试。因此我们可以让Redis开机自启动。
首先我们要知道两个可执行文件作用:
redis-cli.exeRedis客户端,用于连接Redis服务器redis-server.exeRedis服务端,用于在本机运行Redis服务器
由于Redis是msys2编译的,因此使用绝对路径启动命令可能出现不兼容情况导致启动失败。所以说我们先写一个批处理脚本用于以相对路径启动Redis,放在Redis所在目录下(redis-server.exe同级目录下),再把这个脚本加入到注册表的开机自启动项中即可。
在Redis所在目录下新建一个文本文件并修改扩展名为bat:

用文本编辑器打开,把下面命令粘贴进去保存:
@echo off
cd /d %~dp0
redis-server redis.conf
上述第二行cd /d %~dp0表示先切换当前路径至批处理文件自身所在路径下,%~dp0在批处理文件中表示批处理文件自身所在目录。由于这个脚本放在Redis所在目录下,因此这条语句就达到了先切换当前路径到Redis目录下的目的,就可以后续以相对路径启动Redis了!
上面第三行就是Redis的启动命令,redis.conf是我的Redis配置文件,也位于Redis所在目录下。
如果对Redis启动命令和配置文件不明白可以看看:传送门
编写完批处理后,打开注册表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run这一项:

这一项中的所有值都是开机自启动项。
在右边右键-新建-字符串值,名称随意,值为"上述启动Redis的批处理文件位置":


注意注册表值中,路径必须是启动批处理文件的绝对路径并用英文双引号包围!
确定,然后就成功地添加了开机自启动项!
若后续不需要Redis再开机自启动,就把上述新建的注册表值删除即可!