文章出處

回到目錄

Redis這個Nosql的存儲系統一般會被部署到linux系統中,我們可以把它當成是一個數據服務器,對于并發理大時,我們會使用多臺服務器充當Redis服務器,這時,各個Redis之間也是分布式的,而Redis與WWW之間也是一種分布式,對于各個redis之間的分布式不需要我們去干預,它是由我們的redis客戶端去負責鏈接的,你當時鏈到哪臺服務器,完全由客戶端去控制,redis這種模式我們通常稱為“主從模式”,即一個主服務器,主要負責寫入數據,多臺從服務器,負責數據的讀取,而它們之前的數據同步,也是redis自已為我們實現的,我們不需要去干預它,這種模式通常會稱為“多級服務器集群架構”,它大大改善了程序的性能!

下面我們分別開啟主redis和從redis,如圖

對于配置從服務器,我們主要設置port,bind和slaveof這三個參數就可以了,port是端口,bind是從服務器的ip地址,slaveof是主服務器的地址和端口,代碼如下

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>");
                    });

                }
            }

分別進行刷新之后的結果如圖

最后:一處寫入,多處讀取,它會從我們的所有服務器上去讀取,這樣大大改善了程序的相應能力,分布式將在未來對于企業來說,將會是重中之重!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()