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

   

源碼下載完成之後,安裝 最新版的 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 發行包 - 張曉棟 - 博客園 (cnblogs.com)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章