使用MSYS2在Windows下编译Redis

我为啥要研究这个

在编写网站后端程序时,Redis可以视为一种比较理想的缓存方案。

不过非常可惜的是,Redis只在Linux和macOS上,可以直接编译源代码或者通过包管理程序安装。

但是对于现在用的比较多的Windows平台,Redis并未提供官方支持,给出的方案是使用WSL2,但是显然这又变成了在Linux虚拟机里运行Redis,而且WSL2基于Hyper-V,对于部分用户来说,开启Hyper-V会产生一些问题。

曾经,微软维护过Redis的Windows移植版本,但是很可惜的是,这个微软官方移植版的Redis,最终的版本号停留在了3.0版本。虽说也不是不能用,但是实测,部分情况下会出问题。之前我帮其他同学解决其后端程序中的Redis异常时,发现正是他用了这个低版本的Redis,导致了不兼容问题的发生。

那有没有什么办法,能让最新的原版Redis直接运行于Windows上呢?经过个人寻找方案,最终发现了现在自己用的MSYS2在经过适当配置的情况下,可以正常编译Redis,并且可以正常运行。对,就是那种双击exe文件就能打开的那种。

MSYS2如果你之前有过了解,则应该会知道,MSYS2相当于提供了一层POSIX兼容环境,有了这个POSIX兼容环境我们就可以在Windows上编译Redis了。

说实话,弄完之后感觉这像是一种邪道,但是确实是可以的。

废话不多说,直接上干货。

关于Redis 7的适用性
经实测,本文章内容依然适用于编译Redis 7。

下载和配置MSYS2

首先你需要下载MSYS2。第一次启动MSYS2之后记得更换MSYS2的pacman镜像源,否则等下你可能会体验到下载速度极慢的痛苦。

接下来,把MSYS2的/usr/bin文件夹加入到你的环境变量中,以防止之后Redis运行时出现错误。

如果感觉不过瘾,想试试MSYS2 MINGW64做Win32应用开发,还可以把/mingw64/bin也加到你的环境变量中。

接下来,打开你的MSYS2 Bash,输入下面的内容,更新MSYS2环境并安装相关依赖。

pacman -Syu  # 注意可能需要连续输入两次
pacman -S base-devel gcc gdb make cmake autoconf automake openssl-devel

使用MSYS2编译Redis

在经过上述配置之后,你的MSYS2环境已经具备了编译C/C++的能力,并且也安装好了所需要的依赖。

接下来,去Redis官网下载源码,解压。

解压完成后打开MSYS2 Bash,将当前目录切换为你的Redis源代码目录,然后就像Linux下安装Redis那样即可。

make
make install PREFIX=[Redis安装路径]

需要注意的是,MSYS2中,/c/表示C盘,同理,/e/表示E盘。/e/Temp/redis等于Windows下的E:\Temp\redis

如果在编译过程中,出现下面这种报错:

则需要打开MSYS2目录下的/usr/include/dlfcn.h头文件,找到这一段:

#if __GNU_VISIBLE
typedef struct Dl_info Dl_info;

struct Dl_info
{
   char        dli_fname[PATH_MAX];  /* Filename of defining object */
   void       *dli_fbase;            /* Load address of that object */
   const char *dli_sname;            /* Name of nearest lower symbol */
   void       *dli_saddr;            /* Exact value of nearest symbol */
};

extern int dladdr (const void *addr, Dl_info *info);
#endif

删除其中的#if __GNU_VISIBLE#endif,以强制打开头文件中这段代码的编译。

执行完成之后,就可以在安装路径中找到这些编译好的文件。可以发现,有部分文件并非exe格式,无法直接在Windows下执行。可以去redis源码目录中的src文件夹中找到这些程序的exe文件,将它们复制到安装文件夹即可。

紧接着将Redis源代码目录下的redis.conf拷贝到Redis安装目录下。

最后你得到的Redis安装目录应该是这样的:

启动Redis

如果乐意,可以对redis.conf做一些定制化修改。修改好之后就可以启动Redis了。

需要注意的是,启动Redis时,传入的配置文件位置路径必须为MSYS2格式的,毕竟我们的这个Redis是通过MSYS2编译出来的。

redis-server.exe redis.conf
redis-server.exe /d/PortablePrograms/WebsiteServer/RedisOnMsys2/redis.conf

如果想将这个编译好的Redis打包发布,为了防止目标计算机上没有安装MSYS2导致的缺少运行时错误,还可以将MSYS2中的/usr/bin/msys-2.0.dll复制到Redis安装目录下。

好了,这个Redis就算配置好了,让我们用第三方Redis管理程序连接一下试试,连接正常。

一个小提醒

通过MSYS2编译并安装Redis,这种做法并非受到Redis官方支持,因此可能出现潜在的稳定性问题。

所以,将这种方法编译的Redis用于生产环境之前请三思。对于生产环境,还是建议使用官方支持的系统或者方法运行Redis。(实际上都讨论生产环境了,生产环境无脑Linux就行)

不过,将MSYS2编译的Redis作为开发环境的Redis服务器是完全没有问题的,还可以减轻我们开发环境的负担。

评论

  1. Rainy
    5月前
    2022-4-22 11:33:27

    无脑macOS,省事,win前几天因为注册表挂了,所以格掉了

    • 博主
      Rainy
      5月前
      2022-4-22 20:48:48

      对于我而言的话,感觉黑苹果不好折腾,白苹果现在全是ARM架构,也怕编译的时候出问题
      说实话,x86架构算是现在比较好的选择

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇