回到目錄html
Redis這個Nosql的存儲系統通常會被部署到linux系統中,咱們能夠把它當成是一個數據服務器,對於併發理大時,咱們會使用多臺服務器充當Redis服務器,這時,各個Redis之間也是分佈式的,而Redis與WWW之間也是一種分佈式,對於各個redis之間的分佈式不須要咱們去幹預,它是由咱們的redis客戶端去負責連接的,你當時鏈到哪臺服務器,徹底由客戶端去控制,redis這種模式咱們一般稱爲「主從模式」,即一個主服務器,主要負責寫入數據,多臺從服務器,負責數據的讀取,而它們以前的數據同步,也是redis自已爲咱們實現的,咱們不須要去幹預它,這種模式一般會稱爲「多級服務器集羣架構」,它大大改善了程序的性能!linux
下面咱們分別開啓主redis和從redis,如圖redis
對於配置從服務器,咱們主要設置port,bind和slaveof這三個參數就能夠了,port是端口,bind是從服務器的ip地址,slaveof是主服務器的地址和端口,代碼以下sql
port 6380 bind 127.0.0.1 slaveof 127.0.0.1 6379
實例:在主服務器寫入一個字符串,在從服務器讀取字符串緩存
首先對redisConfig進行相關配置,我加了一些說明服務器
/// <summary> /// redis主要信息的配置參數 /// </summary> public sealed class RedisConfigInfo : ConfigurationSection { public static RedisConfigInfo GetConfig() { RedisConfigInfo section = (RedisConfigInfo)ConfigurationManager.GetSection("RedisConfig"); return section; } public static RedisConfigInfo GetConfig(string sectionName) { RedisConfigInfo section = (RedisConfigInfo)ConfigurationManager.GetSection("RedisConfig"); if (section == null) throw new ConfigurationErrorsException("Section " + sectionName + " is not found."); return section; } /// <summary> /// 負責寫入的Redis連接地址,通常爲一個服務器,咱們稱爲主服務器 /// </summary> [ConfigurationProperty("WriteServerList", IsRequired = false)] public string WriteServerList { get { return (string)base["WriteServerList"]; } set { base["WriteServerList"] = value; } } /// <summary> /// 負責讀的Redis連接地址,它通常由多個服務器組件,通常稱爲從服務器(slave),各個服務器之間用逗號分開 /// </summary> [ConfigurationProperty("ReadServerList", IsRequired = false)] public string ReadServerList { get { return (string)base["ReadServerList"]; } set { base["ReadServerList"] = value; } } /// <summary> /// 最大寫連接數 /// </summary> [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)] public int MaxWritePoolSize { get { int _maxWritePoolSize = (int)base["MaxWritePoolSize"]; return _maxWritePoolSize > 0 ? _maxWritePoolSize : 5; } set { base["MaxWritePoolSize"] = value; } } /// <summary> /// 最大讀連接數 /// </summary> [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)] public int MaxReadPoolSize { get { int _maxReadPoolSize = (int)base["MaxReadPoolSize"]; return _maxReadPoolSize > 0 ? _maxReadPoolSize : 5; } set { base["MaxReadPoolSize"] = value; } } /// <summary> /// 自動重啓 /// </summary> [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)] public bool AutoStart { get { return (bool)base["AutoStart"]; } set { base["AutoStart"] = value; } } /// <summary> /// 本地緩存到期時間(超時時間),單位:秒 /// </summary> [ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)] public int LocalCacheTime { get { return (int)base["LocalCacheTime"]; } set { base["LocalCacheTime"] = value; } } /// <summary> /// 是否記錄日誌,該設置僅用於排查redis運行時出現的問題,如redis工做正常,請關閉該項 /// </summary> [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)] public bool RecordeLog { get { return (bool)base["RecordeLog"]; } set { base["RecordeLog"] = value; } } }
而配置文件中,咱們能夠把redis讀服務器和寫服務器進行配置,多個服務器使用逗號分開(redis自己就是支持讀寫分離的)架構
<RedisConfig WriteServerList="192.168.2.71:6379" ReadServerList="192.168.2.71:6379,192.168.2.71:6380" MaxWritePoolSize="60" MaxReadPoolSize="60" AutoStart="true" LocalCacheTime="180" RecordeLog="false"> </RedisConfig>
下面咱們向主服務器加個對象併發
using (var test = redisClient.GetTypedClient<string>()) { test.Lists["Test"].Add("信息被添加"); }
當沒有調用save方法時,對象只存儲在內存中,數據不會被同步到從服務器,而調用了save方法後,數據纔會被同步到各個從服務器中。分佈式
下面咱們添加了這個save方法以後,在從服務器上就會有信息同步了性能
using (var redisClient = RedisManager.GetClient()) { using (var test = redisClient.GetTypedClient<string>()) { test.Lists["bobo"].Add("info"); test.Save(); } }
如圖所示
對於裝有防火牆的服務器來講,固然要把對應的端口開放一下,不然客戶端也是不能連接上的,呵呵
設置好之事,咱們能夠在命令行上測試一下從服務器的數據,如圖
在WEB端進行測試
using (var redisClient = RedisManager.GetClient()) { using (var test = redisClient.GetTypedClient<string>()) { test.Lists["bobo"].ToList().ForEach(i => { Response.Write(redisClient.Port + " " + i); Response.Write("<br>"); }); } }
分別進行刷新以後的結果如圖
最後:一處寫入,多處讀取,它會從咱們的全部服務器上去讀取,這樣大大改善了程序的相應能力,分佈式將在將來對於企業來講,將會是重中之重!