Redis從入門到精通(三)Redis如何實現的主從架構
接著上一篇,前面兩篇我總結了Redis安裝和C#中如何使用redis 。接下來講講Redis 的主從複製以及主從複製的架構下C#中如何呼叫。
Redis跟MySQL一樣,擁有非常強大的主從複製功能,而且還支援一個master可以擁有多個slave,而一個slave又可以擁有多個slave,從而形成強大的多級伺服器叢集架構。
Redis的主從複製是非同步進行的,它不會影響master的執行,所以不會降低Redis的處理效能。主從架構中,可以考慮關閉Master的資料持久化功能,只讓Slave進行持久化,這樣可以提高主伺服器的處理效能。同時Slave為只讀模式,這樣可以避免Slave快取的資料被誤修改。
一、配置主從架構
實際生產中,主從架構是在幾個不同伺服器上安裝相應的Redis服務。為了測試方便,我這邊的主從備份的配置,都是在我Windows 本機上測試,Linux的配置和windows下是一樣的。
1、安裝兩個Redis 例項,Master和Slave。將Master埠設定為6379,Slave 埠設定為6380 。bind 都設定為:127.0.0.1。具體Redis安裝步驟,請參考前一篇博文 《Redis總結(一)Redis安裝》。
2.在Slave 例項 ,增加:slaveof 127.0.0.1 6379 配置。如下圖所示:
配置完成之後,啟動這兩個例項,如果輸出如下內容,說明主從複製的架構已經配置成功了。
注意:在同一臺電腦上測試,Master和Slave的埠不要一樣,否則是不能同時啟動兩個例項的。
二、測試
在命令列,分別連線上Master伺服器和Slave 伺服器。然後在Master 寫入快取,然後在Slave 中讀取。
首先、連線上Master伺服器,輸入如下命令,建立快取:
setzwzzhangweizhong
然後、再連上Slave伺服器,輸入get命令,測試快取資料是否同步到Slave伺服器。
get zwz
具體如下如:
三、實際專案中呼叫
主從架構的Redis的讀寫其實和單臺Redis 的讀寫差不多,只是資料讀取區分了主從,如果不清楚C#中如何使用redis,
不同的地方在於:ServiceStack.Redis 中GetClient()方法,只能拿到Master 伺服器中的Redis連線,而拿不到slave 的readonly連線。這樣 slave起到了
所以,我們需要的寫入和讀取的時候做一個區分,寫入的時呼叫client.GetClient() 來獲取writeHosts的Master的redis 連結。讀取資料則呼叫client.GetReadOnlyClient()來獲取的readonlyHost的 Slave的redis連結。
或者可以直接使用client.GetCacheClient() 來獲取一個連線,他會在寫的時候呼叫GetClient獲取連線,讀的時候呼叫GetReadOnlyClient獲取連線,這樣可以做到讀寫分離,從而利用redis的主從複製功能。
1. 配置檔案 app.config
<!-- redis Start -->
<add key="SessionExpireMinutes" value="180" />
<add key="redis_server_master_session" value="127.0.0.1:6379" />
<add key="redis_server_slave_session" value="127.0.0.1:6380" />
<add key="redis_max_read_pool" value="300" />
<add key="redis_max_write_pool" value="100" />
<!--redis end-->
2.實際專案中,如何使用redis請參考我這篇文章 《Redis總結(二)C#中如何使用redis》。
程式碼片段如下:
//寫入快取時,pool.GetClient()獲取寫連線
using (var r = pool.GetClient())
{
if (r != null)
{
r.SendTimeout = 1000;
r.Set(key, value, expiry - DateTime.Now);
}
}
//讀取快取時,pool.GetReadOnlyClient()獲取寫連線
using(varr=pool.GetReadOnlyClient())
{
if (r != null)
{
r.SendTimeout=1000;
obj = r.Get<T>(key);
}
}
最後
以上就把Redis如何實現的主從架構介紹完了。Redis主從架構使用配置簡單,基本能滿足中小型系統的架構需求。資料量特別大的大型系統一般不使用這種架構。而是使用Redis的分散式架構,這個後面會講。