一、創建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服務來測試,會自動切換訪問的數據。