中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Lind.DDD.RedisClient~對StackExchange.Redis調(diao)用者的封裝及(ji)多(duo)路復用技(ji)術

回到目錄

兩雄爭霸

使用StackExchange.Redis的原因是因為它開源,免費,而對于商業化的ServiceStack.Redis,它將一步步被前者取代,開源將是一種趨勢,商業化也值得被我們尊重,畢竟人家研究代碼也不容易,做商品也很正常,當然這不是我們今天的重點,今天主要說一下對StackExchange.Redis的封裝,它與ServicesStack.redis最大的不同就是,它沒有線程池的概念,這對于初學者絕對是個坑,大家使用時一定要注冊,StackExchange.redis的對象一定要做成靜態化的,或者單例的,不然,你的服務器的CPU將在(zai)不久的將來出現瓶頸,可(ke)以(yi)設(she)想一下,網絡socket只(zhi)建立連接,而不被釋放(fang),是個什么味道!(平凡建立連接,用完釋放,也是一種資料的浪費)

一家獨占-多路復用

數據通信系統或計算機網絡系統中,傳輸媒體的帶寬或容量往往會大于傳輸單一信號的需求,為了有效地利用通信線路,希望一個信道同時傳輸多路信號,這就是所謂的多路復用技術(Multiplexing)。采用(yong)多路(lu)復用(yong)技術能把多個信(xin)號組(zu)合起來在(zai)(zai)一條物理信(xin)道上進行傳輸,在(zai)(zai)遠(yuan)距離傳輸時可大(da)大(da)節省電纜(lan)的安裝和維護費用(yong)。

大叔定義:簡單的說,就是一個連接,一個鏈路,供多個線程使(shi)用(yong),發(fa)數(shu)據(ju)包(bao),收數(shu)據(ju)包(bao)等(deng)!

Lind.DDD.RedisClient就簡單了

   /// <summary>
    /// StackExchange.Redis管理者
    /// 注意(yi):這(zhe)個客(ke)戶(hu)端沒有(you)連接池的概念,而是有(you)了多路復用技術
    /// </summary>
    public class RedisManager
    {
        /// <summary>
        /// 鎖對象
        /// </summary>
        private static object _locker = new object();
        /// <summary>
        /// StackExchange.Redis對象
        /// </summary>
        private static ConnectionMultiplexer instance;

        /// <summary>
        /// 得到StackExchange.Redis單例對象
        /// </summary>
        public static ConnectionMultiplexer Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (_locker)
                    {
                        if (instance != null)
                            return instance;

                        instance = GetManager();
                        return instance;
                    }
                }

                return instance;
            }
        }

        /// <summary>
        /// 構(gou)建鏈接,返回(hui)對象
        /// </summary>
        /// <param name="connectionString">;</param>
        /// <returns></returns>
        private static ConnectionMultiplexer GetManager()
        {
            string connectionString = ConfigConstants.ConfigManager.Config.Redis.Host;
            if (string.IsNullOrEmpty(connectionString))
            {
                throw new ArgumentNullException("請配置Redis連接串!");
            }
            return ConnectionMultiplexer.Connect(connectionString);
        }

    }

對于(yu)多路利(li)用的(de)并發測試

        [TestMethod]
        public void Redis_Async()
        {
            List<Action> actionList = new List<Action>();
            actionList.Add(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    RedisClient.RedisManager.Instance.GetDatabase().SetAdd("test01", i.ToString());
                    Thread.Sleep(100);
                    Console.WriteLine("test011" + i);
                }
            });
            actionList.Add(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    RedisClient.RedisManager.Instance.GetDatabase().SetAdd("test02", i.ToString());
                    Thread.Sleep(10);
                    Console.WriteLine("test012" + i);
                }
            });
            Parallel.Invoke(actionList.ToArray());
        }

通過測試和觀(guan)察,我(wo)們可以看(kan)到,這(zhe)個(ge)并(bing)發的線程同(tong)時使(shi)用一(yi)個(ge)RedisManager的實例,并(bing)沒有出(chu)現阻塞的情況,即同(tong)一(yi)個(ge)鏈路,處理了多個(ge)任務!

回到目錄

posted @ 2016-09-28 14:21  張占嶺  閱讀(1979)  評論(5)    收藏  舉報