Redis學習筆記~Redis實現多個緩存伺服器,讀寫分離

來源:互聯網
上載者:User

標籤: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實現多個緩存伺服器,讀寫分離

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.