6

使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包 - 张晓栋

 2 years ago
source link: https://www.cnblogs.com/berkerdong/p/16553914.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包

Redis 是个高性能的键值数据库,现在日常项目开发过程中,目前个人开发项目基本都会用到 Redis,主要是用来做 缓存 和 分布式锁 的底层支持,个人喜欢用 .NET 技术体系,所以一般部署也是用 Windows 服务器居多,但是目前 Redis 官方并没有提供 Windows 版本的Redis 发行包,网上能找到的一些 Windows 版的 Redis 都是比较老的版本了,目前最新的 Redis master 已经是 7.x 版本了,深入研究后发现 Redis 是用 C 语言开发的,所以还是有编译到Windows版的可能的,这里给大家分享我编译 Windows 版 Redis 的操作。

首先介绍以下基本思路,整体过程主要为以下几步

  1. 获取 Redis 最新版 源码  https://github.com/redis/redis/releases
  2. 安装 MSYS2 并编译 Redis 源码
  3. 使用 .NET6 开发一个 RedisService 用于将 编译好的 Redis 整合成服务,支持以 Windows 服务运行

首先我们将 Redis 的源码下载到本地文件夹,可以直接从 https://github.com/redis/redis/releases 页面下载最新版的 源码,截至目前最新版是 7.0.4 ,这里我们下载 tar.gz 格式的压缩包

1963085-20220805114123118-735045.png

源码下载完成之后,安装 最新版的 MSYS2 ,这是一个编译工具,可以用于在 Windows 下编译 Linux 中的一些软件,本次我们就使用他来将 Redis 的源码编译为 Windows 版本

https://www.msys2.org 这个是官网地址,可以从这里下载

1963085-20220805111614649-1257668533.png

 MSYS2 的安装过程就不展开了,下载 exe 之后直接点击下一步,下一步的操作就可以了,没有什么需要特别注意的。

MSYS2 安装之后,从开始菜单找到MSYS2 MSYS 开始运行,进入 MSYS2 之后主要就依赖于命令行的操作了。过程中会询问是否继续,选择 Y

#更新 MSYS2 系统

pacman -Syu

1963085-20220805113733690-975067964.png

 # 安装 gcc make pkg-config

pacman -Sy gcc make pkg-config

1963085-20220805113454429-1499176464.png

# 切换到编译的目录(MSYS2 /d 就是 D盘;/e 就是 E盘) 我这里预先在 D盘创建了一个 redis 空文件夹用于本次的编译操作
cd /d/redis

1963085-20220805122116299-1379580888.png

将下载好的 源代码压缩包剪切到对应的编译目录,我们这里是 d:/redis/

1963085-20220805121801210-1354038250.png

# 解压 redis 源码

tar -xvf redis-7.0.4.tar.gz

1963085-20220805122021375-1744411153.png

# 进入源码目录
cd redis-7.0.4

1963085-20220805122059986-694570248.png

然后需要到 MSYS2 的安装目录去修改 dlfcn.h 文件,具体如下:

打开 C:\msys64\usr\include\usr\include\dlfcn.h 文件修改源码 注释或删除掉 宏判定 #if __GNU_VISIBLE (49行)和 #endif (61行) 不然会报找不到结构 Dl_info 错误。

MSYS2 目录默认为:C:\msys64\ ,这个其实就是msys2 的安装目录,如果安装过程中修改了安装目录,则到自己对应的安装目录然后依次找到 usr 文件夹 下的 include 文件夹下的 dlfcn.h 文件即可

1963085-20220805122842015-21598538.png

 需要对这段代码注释掉 第49行和61行,如下图

1963085-20220805123924551-1464823106.png

 注释之后保存退出即可,然后重新回到我们的 MSYS2 终端控制台开始进行编译 Redis

# 编译
make PREFIX=/d/redis/dist install

1963085-20220805123527010-1014038133.png

 过程中会有一些警告之类的信息可以直接忽略,只要可以成功编译即可。

编译成功之后,在电脑的 d:\redis\dist\bin 文件夹就可以看到编译后的 windows 版 exe 文件

1963085-20220805124233785-417263701.png

编译完成后还需要复制如下三个文件

msys-2.0.dll 位于 c:\msys64\usr\bin
redis.conf 位于 redis源码文件夹,d:\redis\redis-7.0.4
sentinel.conf 位于 redis 源码文件夹,d:\redis\redis-7.0.4

复制以上三个文件到我们的 d:\redis\dist\bin 文件夹

1963085-20220805124609026-577476512.png

 我们的 d:\redis\dist\bin 文件夹总共应该有这些文件。

需要注意因为 MSYS2 的规定,我们的软件必须至少要放置在 2层目录文件夹内,才可以正常运行,比如 d:/redis/dist/bin/ 可以,d:/redis/ 则不可以。

RedisServer 可以通过如下两种方式启动

cmd 启动

d:
cd d:\redis\dist\bin
redis-server.exe redis.conf

powershell 启动

d:
cd d:\redis\dist\bin
./redis-server.exe redis.conf
1963085-20220805145829975-2067770749.png

 当启动后出现上面的界面就说明我们的 redis-server 正式编译发布成功了,可以用自己习惯的 redis 连接工具去尝试连接 127.0.0.1:6379 ,我个人习惯使用 Another Redis Desktop Manager,连接之后可以看到如下面的状态信息

1963085-20220805125122035-181255941.png

 从状态如看出来是 7.0.4 的版本,至此 关于利用 Redis源码编译发布 Windows版的 Reidis 的操作就完成了,下面介绍如何结合 .NET 来开发一个 Windows 服务,为我们编译的这个 redis-server.exe 实现 windows 服务的安装运行模式。否则每次使用都要去手动启动 redis-server.exe 比较繁琐。

首先利用 VisualStudio 创建一个 .NET 6 的控制台程序,然后在Nuget 安装 Microsoft.Windows.Compatibility 组件

整个项目的代码不多,主要就是 Program.cs 代码内容如下:

using System.Diagnostics;
using System.ServiceProcess;

namespace RedisService
{
    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(":")];
            var confPath = basePath.Replace(diskSymbol + ":", "/cygdrive/" + diskSymbol);

            ProcessStartInfo processStartInfo = new(basePath + "redis-server.exe", confPath + "redis.conf");
            process = Process.Start(processStartInfo);
        }

        protected override void OnStop()
        {
            if (process != null)
            {
                process.Kill();
                process.Dispose();
            }
        }
    }

}

发布的时候推荐如下设置:采用独立模式,启用预编译发布为单个文件

1963085-20220805132020823-1876176135.png

发布后得到如下文件

1963085-20220805132211334-99326640.png

 将发布后的文件拷贝到  d:\redis\dist\bin 文件夹和我们开始发布的 Redis 文件放到同一个目录

 

1963085-20220805132331681-1639342167.png

这样我们整个 RedisServer 就制作完成了,可以把这些文件全部打包保存起来,将来想要安装到某台电脑时,只要执行如下的 安装,卸载,启动,停止 命令即可

假设 我们将这个文件夹放在了 d:/Software/Redis/

需要注意因为 MSYS2 的规定,我们的软件必须至少要放置在 2层目录文件夹内,才可以正常运行,比如 d:/Software/Redis/ 可以,d:/Software/ 则不可以。

sc.exe create Redis binpath= 'D:\Software\Redis\RedisService.exe' start= auto

这样就把成功把我们自己制作的 Windows版Redis安装好了,每次开机都会自动启动

net start Redis

net stop Redis

sc.exe delete Redis

至此 使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包 就讲解完了,有任何不明白的,可以在文章下面评论或者私信我,欢迎大家积极的讨论交流,有兴趣的朋友可以关注我目前在维护的一个 .net 基础框架项目,项目地址如下

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK