前言
最近Redis更新了7.0了,但是官方还是没有支持windows。有时想在windows下使用还是不太方便,所以就研究了下在windows编译redis。当然,如果不想自己捣鼓,可以去github找编译好的,比如redis-windows这个。
官方不支持Windows,就意味着不能正常使用msvc
进行编译,所以只能选择使用 Cygwin
或者 MSYS2
进行编译。
需要注意的是,无论使用 Cygwin
编译还是 MSYS2
编译,都依赖Cygwin
或者MSYS2
的库,都是经过转换,会有一定的性能损失。不过基本开发使用是没有问题的。
使用Cygwin编译
# 安装需要的依赖 gcc-core gcc-g++ make tcl wget
.\setup-x86_64.exe -q -P gcc-core -P make -P gcc-g++ -P tcl -P wget
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
# 解压
tar -zxvf redis-stable.tar.gz
cd redis-stable
# 编译
make clean
make PREFIX=/cygdrive/f/Tools/redis-7.0 install
编译完成之后,就可以在目录下看到编译好的执行文件了。
注意:如果想要在windows直接运行,而不是进入 cygwin
环境运行,需要把 cygwin1.dll
库也复制到当前目录下,否则会运行不了。这个库可以在 cygwin
安装目录的 bin
目录下找到。相关配置文件可以到源码根目录下找到,比如:redis.conf
和sentinel.conf
。
启动,可以使用,并且可以连接,添加数据。
使用MSYS2编译
安装MSYS2,使用scoop直接安装即可,scoop install msys2
,关于scoop的详细使用方法,可以参考scoop
# 更新源
pacman -Sy
# 安装环境
pacman -S make pkg-config gcc python
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
# 解压
tar -zxvf redis-stable.tar.gz
cd redis-stable
# 编译
make
make PREFIX=/f/Tools/redis-7.0-MSYS2 install
遇到的错误
如果直接编译的话,因为是在windows平台,所以编译条件不满足的话,会漏引入Dl_info
结构体。
修改 usr/include/dlfcn.h
头文件。
把以下条件编译注释掉
修改后再次编译即可。看到以下的就说明编译成功了。
注意:和使用cygwin
一样,如果想要在windows直接运行,而不是进入 msys2
环境运行,需要把 msys-2.0.dll
库也复制到当前目录下,否则会运行不了。这个库可以在 msys2
安装目录的 usr/bin
目录下能找到。
最后运行,也没有问题。
创建为Windows服务
方式一:自己编写服务
创建一个C#控制台项目
。
通过nuget
添加Microsoft.Windows.Compatibility
依赖。
编写代码。
using System.Diagnostics;
using System.ServiceProcess;
namespace redis_windows_service
{
static class Program
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:验证平台兼容性",
Justification = "<挂起>")]
static void Main()
{
ServiceBase.Run(new RedisService());
}
}
partial class RedisService : ServiceBase
{
private Process? process = new();
protected override void OnStart(string[] args)
{
var basePath = Path.Combine(AppContext.BaseDirectory).Replace("\\", "/");
// var diskSymbol = basePath[..basePath.IndexOf(":")];
// 如果是 Cygwin 编译的
// var confPath = basePath.Replace(diskSymbol + ":", "/cygdrive/" + diskSymbol);
var confPath = "./";
ProcessStartInfo processStartInfo =
new(basePath + "redis-server.exe", confPath + "redis.conf")
{
WorkingDirectory = basePath
};
process = Process.Start(processStartInfo);
}
protected override void OnStop()
{
if (process != null)
{
process.Kill();
process.Dispose();
}
}
}
}
发布程序,打包成单文件。
发布成功。
最终生成有3个文件。
把三个文件和编译好的redis文件放在一起,最终目录结构如下:
管理员启动终端。
# 添加到服务
# 如果需要开机启动的,后面添加 start= auto 参数
sc.exe create redis binpath=F:\WorkSpace\ServerSoft\redis-7.0-MSYS2\redis-windows-service.exe
# 删除服务
sc.exe delete redis
# 启动redis服务
sudo net start redis
# 停止服务
sudo net stop redis
简单测试下,可以使用。
方式二:通过WinSW创建
winsw是一个可以把Windows应用打包成Windows服务的开源应用。
去release界面下载执行文件和配置文件,一个是sample-minimal.xml
,一个是WinSW-x64.exe
。
把这2个文件复制到redis目录下面,并都修改名字为RedisService
,如下图:
修改RedisService.xml
配置文件。
<service>
<service>
<id>redis</id>
<name>redis-7.0</name>
<description>Redis 7.0</description>
<executable>F:/Tools/redis-7.0-MSYS2/bin/redis-server.exe</executable>
<logpath>F:/Tools/redis-7.0-MSYS2/bin//logs</logpath>
<logmode>roll</logmode>
</service>
</service>
命令行进入该目录,执行安装指令。
# 安装
RedisService.exe install RedisService.xml
# 启动
RedisService.exe start RedisService.xml
# 查看状态
RedisService.exe status RedisService.xml
# 卸载
RedisService.exe uninstall RedisService.xml
安装成功后,之后的使用方式和上一种方式是一样的,这里就不重复了。