我为啥要研究这个
在编写网站后端程序时,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了。
说实话,弄完之后感觉这像是一种邪道,但是确实是可以的。
下载和配置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服务器是完全没有问题的,还可以减轻我们开发环境的负担。
无脑macOS,省事,win前几天因为注册表挂了,所以格掉了
对于我而言的话,感觉黑苹果不好折腾,白苹果现在全是ARM架构,也怕编译的时候出问题
说实话,x86架构算是现在比较好的选择
MSYS2慢死了,别问我怎么知道的()