標籤:style blog http color io os ar 使用 for
回到目錄
Redis這個Nosql的儲存系統一般會被部署到linux系統中,我們可以把它當成是一個資料服務器,對於並發理大時,我們會使用多台伺服器充當Redis伺服器,這時,各個Redis之間也是分布式的,而Redis與WWW之間也是一種分布式,對於各個redis之間的分布式不需要我們去幹預,它是由我們的redis用戶端去負責連結的,你當時鏈到哪台伺服器,完全由用戶端去控制。
下面看一下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連結地址,多個主機用逗號分開 /// </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,192.168.2.72:6379" ReadServerList="192.168.2.71:6379,192.168.2.72:6379" MaxWritePoolSize="60" MaxReadPoolSize="60" AutoStart="true" LocalCacheTime="180" RecordeLog="false"> </RedisConfig>
而我們使用多線程來測試一下
//testing redis 100 threads for (int i = 0; i < 100; i++) { Task.Run(() => { using (var redisClient = RedisManager.GetClient()) { using (var test = redisClient.GetTypedClient<string>()) { test.Lists["print"].Enqueue("資訊被添加"); var s = test.Lists["print"].Dequeue(); Response.Write(s); Response.Write(redisClient.Host); Response.Write("<br>"); } } }); }
測試的結果就是,在每個用戶端請求時,都會隨機去分配一個redis伺服器,我們可以看一下
通過上面的圖可以看到,我們的資訊被分別寫到了兩台redis伺服器中,而問題又來了,在用戶端去取資料時,你可能會取redisserver1裡的資料,也有可能取redisserver2裡的資料,而真正完整的資料是這兩台server的並集,如何將多台server的資料合併,這是我們要解決的問題,如果這個問題不能解決,那多台server也就沒有意思了,下一講,我們將主要來說一下多台redisServer的資料同步問題。
回到目錄
Redis學習筆記~Redis實現多個緩存伺服器,讀寫分離