.Net Core 使用 CSRedisCore 訪問 Redis 的哨兵和主從複製

以往清泉發表於2021-02-03

一、建立Redis服務

執行環境是Window,安裝Redis請看:安裝教程。

直接開始建立Redis服務,演示就建立兩個一主一從,先把安裝路徑下的 redis.windows.conf 檔案複製一份重新命名並更改埠號為6380,

並且把檔案中的bind欄位註釋,protected-mode設定為no,

開啟CMD跳轉到安裝目錄,建立服務語句如下

D:\Redis>redis-server.exe --service-install redis.windows.conf --service-name Redis6379 --loglevel verbose
D:\Redis>redis-server.exe --service-install redis.windows.6380.conf --service-name Redis6380 --loglevel verbose

 然後開啟服務,如果沒有執行就點選啟動執行。

二、設定Redis主從複製

將6379埠的Redis作為主,6380埠的作為從,通過slaveof命令設定從Redis即可如下:

C:\Users\Xu>redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK

 我這是本地的服務所以訪問沒問題,如果是不同伺服器的服務,請關注防火牆、ip等資訊,確保伺服器直接能互相訪問。

三、設定哨兵

 在Redis安裝路徑中新建哨兵配置檔案sentinel.conf如下:

port 26379
protected-mode no
logfile "D:/Redis/senitnel.log"
sentinel monitor mymaster 127.0.0.1 6379 1

檔案中設定了哨兵的埠、是否保護、日誌檔案儲存地址和監聽的主Redis資料庫。一般是需要多個哨兵的,演示的話就建立一個,想多建立幾個就多建幾個配置檔案,然後將哨兵設為服務,管理員開啟CMD語句如下:

sc create RedisSentinel binpath= "\"D:\Redis\redis-server.exe\" --service-run sentinel.conf --service--name RedisSentienl --sentinel --loglevel verbose" start= auto

可以看到服務中已經有了,沒有啟動就啟動下,哨兵這裡如果是多臺伺服器就需要注意防火牆、ip等資訊,否則無法連通。啟動後配置檔案會被寫入其他的哨兵和從資料庫等資訊,如下

port 26379
protected-mode no
logfile "D:/Redis/senitnel.log"
sentinel myid bc139114daeb8c50b65466ae58f89822503b58da
# Generated by CONFIG REWRITE
loglevel verbose
dir "D:\\Redis"
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel config-epoch mymaster 6
sentinel leader-epoch mymaster 6
sentinel known-slave mymaster 127.0.0.1 6380
sentinel current-epoch 6

我們通過redis-cli命令可以進入哨兵和redis資料庫檢視資訊,來判斷是否配置正確,我們進入哨兵檢視資訊如下:

C:\Users\Xu>redis-cli -h 127.0.0.1 -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=1,sentinels=1

可以看到最後一條顯示主資料是6379埠的,從資料一個哨兵一個,說明配置成功了(如果有問題可以通過哨兵日誌等方式檢視問題)。

四、在.Net Core中實現程式碼

 在nuget中引用CSRedisCore,有兩個類可以訪問哨兵並訪問redis資料庫,分別是CSRedisClient和RedisSentinelManager。

1.RedisSentinelManager

public static void Set(int dbid)
{
    using (var sentinel = new RedisSentinelManager(false, new string[] { "127.0.0.1:26379" }))   //設定哨兵
    {
        sentinel.Connect("mymaster"); // 開啟主資料庫連線,引數是主資料庫別稱,在設定哨兵的時候有設定
        var test2 = sentinel.Call(t => t.Select(dbid)); // 使用Call方法可以執行當前主資料的操作,select方法是選擇資料庫0-14號進行操作
        sentinel.Call(t => t.Set("haha", DateTime.Now.ToString()));//執行方法
    }
}    

2.CSRedisClient

public class RedisCache
{
    CSRedisClient[] redis = new CSRedisClient[14]; //Singleton
    public RedisCache()
    {
    for (var a = 0; a < redis.Length; a++)
     redis[a] = new CSRedisClient("mymaster,defaultDatabase=" + a, new string[] { "127.0.0.1:26379" });
    }
    public void Set(int dbid)
    {
        redis[1].Set("haha","123123");
    }
}    

可以手動關閉redis服務來測試,會自動切換訪問的資料。

相關文章