Redis 是个高性能的键值数据库,现在日常项目开发过程中,目前个人开发项目基本都会用到 Redis,主要是用来做 缓存 和 分布式锁 的底层支持,个人喜欢用 .NET 技术体系,所以一般部署也是用 Windows 服务器居多,但是目前 Redis 官方并没有提供 Windows 版本的Redis 发行包,网上能找到的一些 Windows 版的 Redis 都是比较老的版本了,目前最新的 Redis master 已经是 7.x 版本了,深入研究后发现 Redis 是用 C 语言开发的,所以还是有编译到Windows版的可能的,这里给大家分享我编译 Windows 版 Redis 的操作。
首先介绍以下基本思路,整体过程主要为以下几步
- 获取 Redis 最新版 源码 https://github.com/redis/redis/releases
- 安装 MSYS2 并编译 Redis 源码
- 使用 .NET6 开发一个 RedisService 用于将 编译好的 Redis 整合成服务,支持以 Windows 服务运行
首先我们将 Redis 的源码下载到本地文件夹,可以直接从 https://github.com/redis/redis/releases 页面下载最新版的 源码,截至目前最新版是 7.0.4 ,这里我们下载 tar.gz 格式的压缩包
源码下载完成之后,安装 最新版的 MSYS2 ,这是一个编译工具,可以用于在 Windows 下编译 Linux 中的一些软件,本次我们就使用他来将 Redis 的源码编译为 Windows 版本
https://www.msys2.org 这个是官网地址,可以从这里下载
MSYS2 的安装过程就不展开了,下载 exe 之后直接点击下一步,下一步的操作就可以了,没有什么需要特别注意的。
MSYS2 安装之后,从开始菜单找到MSYS2 MSYS 开始运行,进入 MSYS2 之后主要就依赖于命令行的操作了。过程中会询问是否继续,选择 Y
#更新 MSYS2 系统
pacman -Syu
# 安装 gcc make pkg-config
pacman -Sy gcc make pkg-config
# 切换到编译的目录(MSYS2 /d 就是 D盘;/e 就是 E盘) 我这里预先在 D盘创建了一个 redis 空文件夹用于本次的编译操作 cd /d/redis
将下载好的 源代码压缩包剪切到对应的编译目录,我们这里是 d:/redis/
# 解压 redis 源码
tar -xvf redis-7.0.4.tar.gz
# 进入源码目录 cd redis-7.0.4
然后需要到 MSYS2 的安装目录去修改 dlfcn.h 文件,具体如下:
打开 C:msys64usrincludeusrincludedlfcn.h 文件修改源码 注释或删除掉 宏判定 #if __GNU_VISIBLE (49行)和 #endif (61行) 不然会报找不到结构 Dl_info 错误。
MSYS2 目录默认为:C:msys64 ,这个其实就是msys2 的安装目录,如果安装过程中修改了安装目录,则到自己对应的安装目录然后依次找到 usr 文件夹 下的 include 文件夹下的 dlfcn.h 文件即可
需要对这段代码注释掉 第49行和61行,如下图
注释之后保存退出即可,然后重新回到我们的 MSYS2 终端控制台开始进行编译 Redis
# 编译 make PREFIX=/d/redis/dist install
过程中会有一些警告之类的信息可以直接忽略,只要可以成功编译即可。
编译成功之后,在电脑的 d:redisdistbin 文件夹就可以看到编译后的 windows 版 exe 文件
编译完成后还需要复制如下三个文件
msys-2.0.dll 位于 c:msys64usrbin redis.conf 位于 redis源码文件夹,d:redisredis-7.0.4 sentinel.conf 位于 redis 源码文件夹,d:redisredis-7.0.4
复制以上三个文件到我们的 d:redisdistbin 文件夹
我们的 d:redisdistbin 文件夹总共应该有这些文件。
需要注意因为 MSYS2 的规定,我们的软件必须至少要放置在 2层目录文件夹内,才可以正常运行,比如 d:/redis/dist/bin/ 可以,d:/redis/ 则不可以。
RedisServer 可以通过如下两种方式启动
cmd 启动
代码语言:javascript复制d:
cd d:redisdistbin
redis-server.exe redis.conf
powershell 启动
代码语言:javascript复制d:
cd d:redisdistbin
./redis-server.exe redis.conf
当启动后出现上面的界面就说明我们的 redis-server 正式编译发布成功了,可以用自己习惯的 redis 连接工具去尝试连接 127.0.0.1:6379 ,我个人习惯使用 Another Redis Desktop Manager,连接之后可以看到如下面的状态信息
从状态如看出来是 7.0.4 的版本,至此 关于利用 Redis源码编译发布 Windows版的 Reidis 的操作就完成了,下面介绍如何结合 .NET 来开发一个 Windows 服务,为我们编译的这个 redis-server.exe 实现 windows 服务的安装运行模式。否则每次使用都要去手动启动 redis-server.exe 比较繁琐。
首先利用 VisualStudio 创建一个 .NET 6 的控制台程序,然后在Nuget 安装 Microsoft.Windows.Compatibility 组件
整个项目的代码不多,主要就是 Program.cs 代码内容如下:
代码语言:javascript复制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");
processStartInfo.WorkingDirectory = basePath;
process = Process.Start(processStartInfo);
}
protected override void OnStop()
{
if (process != null)
{
process.Kill();
process.Dispose();
}
}
}
}
发布的时候推荐如下设置:采用独立模式,启用预编译发布为单个文件
发布后得到如下文件
将发布后的文件拷贝到 d:redisdistbin 文件夹和我们开始发布的 Redis 文件放到同一个目录
这样我们整个 RedisServer 就制作完成了,可以把这些文件全部打包保存起来,将来想要安装到某台电脑时,只要执行如下的 安装,卸载,启动,停止 命令即可
假设 我们将这个文件夹放在了 d:/Software/Redis/
需要注意因为 MSYS2 的规定,我们的软件必须至少要放置在 2层目录文件夹内,才可以正常运行,比如 d:/Software/Redis/ 可以,d:/Software/ 则不可以。
安装服务
sc.exe create Redis binpath= 'D:SoftwareRedisRedisService.exe' start= auto
这样就把成功把我们自己制作的 Windows版Redis安装好了,每次开机都会自动启动
启动服务
net start Redis
停止服务
net stop Redis
卸载服务
sc.exe delete Redis
至此 使用 Redis 源码编译发布 Windows 版 Redis For Windows 发行包 就讲解完了,有任何不明白的,可以在文章下面评论或者私信我,欢迎大家积极的讨论交流,有兴趣的朋友可以关注我目前在维护的一个 .net 基础框架项目,项目地址如下
https://github.com/berkerdong/NetEngine.git
https://gitee.com/berkerdong/NetEngine.git