.net core使用CSRedisCore訪問Redis主從+哨兵

sundna發表於2019-06-29

本文主要目的是對Redis主從+哨兵的高可用方案進行實驗,文中使用的技術不進行深入說明,想深入瞭解的可自行百度。

用到的軟體和版本:

 

1. 下載Redis安裝包

本示例使用Windows10搭建Redis環境,Windows下的Redis下載方式如下

開啟網址 https://github.com/microsoftarchive/redis/releases,下載3.2.100的壓縮包

2. 搭建Redis主從叢集

將壓縮包解壓然後複製,總共3份,我們搭建1主2從模式,Redis6379(主),Redis6479(從),Redis6579(從)

主Redis配置,進入Redis6379目錄中,配置 redis.windows.conf

#配置IP繫結
bind 0.0.0.0
#配置埠
port 6379
#是否保護模式
protected-mode no

為了方便執行,目錄下加個run.bat檔案

redis-server redis.windows.conf

從Redis配置,分別進入Redis6479和Redis6579目錄,配置redis.windows.conf,並新增run.bat檔案

#配置IP繫結
bind 0.0.0.0
#配置埠,分別配置6479和6579
port 6479
#是否保護模式
protected-mode no
#配置主redisd的IP和埠
slaveof 192.168.1.5 6379

現在Redis配置好了,執行3個Redis目錄中的run.bat啟動服務,執行後可以看到主從都成功連線。

3.搭建哨兵

實際使用中一般會使用多個哨兵進行監控,本文作了簡化,只使用1個哨兵,多個哨兵都是相同的配置,僅區分埠。

將Redis目錄複製一份命名為RedisSentinel,新增sentinel.conf檔案,內容如下:

port 27000 #哨兵執行埠
protected-mode no  #非保護模式執行
#監控的主Redis的IP和埠,1表示1個哨兵
sentinel monitor redis-master 192.168.1.5 6379 1  
#主機掉線以後5s進行認證,如果無法連線則重新由哨兵從slave中選出新的master
sentinel down-after-milliseconds redis-master 5000 
sentinel failover-timeout redis-master 60000

CMD中通過命令執行哨兵

redis-server sentinel.conf --sentinel 

可以看到哨兵已經發現1主2從並開始監聽了

也可通過命令檢視哨兵狀態

redis-cli -p 27000 info sentinel

4. .NET Core中使用Redis叢集

我們使用CSRedisCore來訪問Redis,CSRedisCore是國內大牛開發的一個.net core redis 元件,原始碼可讀性很強非常乾淨,幾乎無任何依賴。效能相比ServiceStack.Redis和StackExchange.Redis會快10%左右,支援Redis的高階特性:訂閱/釋出,Pipeline,MGet/MSet,叢集,分割槽。

建立一個.net core 控制檯程式,然後新增nuget包

nuget Install-Package CSRedisCore

Program.cs程式碼

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //連線哨兵
            var csredis = new CSRedis.CSRedisClient("redis-master", new[] {"127.0.0.1:27000" });

            //初始化 RedisHelper
            RedisHelper.Initialization(csredis);

            while (true)
            {
                try
                {
                    Test();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                Console.ReadLine();
            }
            Console.ReadKey();
        }

        static void Test()
        {
            RedisHelper.Set("name", "祝雷");//設定值。預設永不過期
            Console.WriteLine(RedisHelper.Get<String>("name"));

            RedisHelper.Set("time", DateTime.Now, 1);
            Console.WriteLine(RedisHelper.Get<DateTime>("time"));
            Console.WriteLine(RedisHelper.Get<DateTime>("time"));

            // 列表
            RedisHelper.RPush("list", "第一個元素");
            RedisHelper.RPush("list", "第二個元素");
            RedisHelper.LInsertBefore("list", "第二個元素", "我是新插入的第二個元素!");
            Console.WriteLine($"list的長度為{RedisHelper.LLen("list")}");
            Console.WriteLine($"list的第二個元素為{RedisHelper.LIndex("list", 1)}");
        }
    }
}

模擬故障進行測試,啟動程式後,殺死主Redis程式,.net core程式再次訪問Redis會出現一次異常檢查,然後能正常切換到新的master上。

相關文章