1. 程式人生 > 其它 >Redis從入門到精通(三)Redis如何實現的主從架構

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起到了

二手遊戲賬號賣號地圖冗餘備份的作用,讀的功能沒有發揮出來,如果併發請求太多的話,則Redis的效能會有影響。

所以,我們需要的寫入和讀取的時候做一個區分,寫入的時呼叫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的分散式架構,這個後面會講。