抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

前言

最近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.confsentinel.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服务

方式一:自己编写服务

参考redis-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

安装成功后,之后的使用方式和上一种方式是一样的,这里就不重复了。

评论