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 頁面下載最新版的 原始碼,截至目前最新版是 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