使用 Redis 原始碼編譯釋出 Windows 版 Redis For Windows 發行包

2022-08-05 15:00:50

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 格式的壓縮包

   

原始碼下載完成之後,安裝 最新版的 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:\msys64\usr\include\usr\include\dlfcn.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:\redis\dist\bin 資料夾就可以看到編譯後的 windows 版 exe 檔案

編譯完成後還需要複製如下三個檔案

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 資料夾

  

 我們的 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

 

 當啟動後出現上面的介面就說明我們的 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 程式碼內容如下:

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();
            }
        }
    }

}

 

釋出的時候推薦如下設定:採用獨立模式,啟用預編譯釋出為單個檔案

 

釋出後得到如下檔案

 

 將釋出後的檔案拷貝到  d:\redis\dist\bin 資料夾和我們開始釋出的 Redis 檔案放到同一個目錄

  

 

這樣我們整個 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 基礎框架專案,專案地址如下