分布式緩衝Memcache和Redis

來源:互聯網
上載者:User

標籤:style   http   io   color   ar   使用   sp   檔案   資料   

引言

        針對於現在電腦的CPU和網路設施,對應用程式來說,執行效率的瓶頸,已經不是代碼的長度(實現同一個功能)和頻寬了,而是,代碼訪問資源的過程,即:讓我們的程式慢下來的罪魁禍首就是IO操作。

       程式從硬碟上讀取資料是一個非常花費時間的操作,因為我們現在所使用的硬碟是機械式的,你想機械的運行速度和電的速度,那是一個層級上的選手嗎?

       為瞭解決程式的瓶頸,人們提出了一種想法:使用空間換取時間。程式訪問硬碟用的時間長,那就讓資料放到記憶體中,讓程式訪問記憶體,這樣不就節省了時間。這樣確實剩下了我們程式擷取資料時的等待時間,但是,我們的記憶體卻是被佔用了。

       我們大家都知道,記憶體這個資源對於電腦來說,是非常緊缺和有限的(就那麼多),如果我們電腦的記憶體資源都被這些資料使用了,那麼一定會影響我們程式的啟動並執行,你想,如果此時程式再需要一片記憶體空間的話,電腦會有什麼反應,不用說,一定進行虛擬記憶體處理,虛擬記憶體是什嗎?硬碟上的空間,你看,我們費了半天勁又繞到了這個瓶頸,這不得不償失嘛。

       當然,上面的那種情況是程式和快取資料共用一個電腦的記憶體,如果,這個程式使用的人少,那麼程式和快取資料在一個電腦上只有積極的影響,沒有負面的影響,但是,如果我們程式推廣出去了,而且被所有人所接受,致使我們伺服器每一分鐘都有10萬使用者的訪問量,此時,上述的那種情況就會嚴重影響程式的效率了。

為瞭解決上述的問題,於是出現了分布式緩衝,硬碟上的資料,緩衝在別的電腦(不是程式啟動並執行電腦)的記憶體上,而且,可以緩衝的電腦的個數不止一個,可以是n個。這個就是本篇部落格的主要內容:分布式緩衝Memcache(主講)和Redis(做個簡介)


操作流程

        下載Memcache服務端;啟動服務;下載.net平台的驅動;應用程式中添加驅動的引用;編寫程式


具體操作(Memcache)

        下載Mecached伺服器(win版),安裝並啟動伺服器。開啟命令視窗,切換到memcached檔案目錄,然後,輸入:memcached.exe –d install和memcached.exe –d start,此時安裝並啟動了服務。引入相應的驅動(dll)

        編程代碼如下:

        staticvoidMain(string[] args)

        {

            //組成memcache叢集

            //string[]servers = { "127.0.0.1:11211","10.0.9.20:11211" };叢集

            string[]servers = { "127.0.0.1:11211" };

            //初始化對象池

            SockIOPool pool = SockIOPool.GetInstance();

            //SockIOPoolpool = SockIOPool.GetInstance("test1");

           

           pool.SetServers(servers);

           pool.InitConnections = 3;

           pool.MinConnections = 3;

           pool.MaxConnections = 5;

           pool.SocketConnectTimeout = 1000;

           pool.SocketTimeout = 3000;

           pool.MaintenanceSleep = 30;

           pool.Failover = true;

           

           pool.Nagle = false;

            //產生對象

           pool.Initialize();

            //用戶端執行個體

            MemcachedClient mc = new MemcachedClient();

            //不壓縮

           mc.EnableCompression = false;

            //mc.PoolName= "test1";//獲得指定對象池的對象

           mc.Set("key1","Value1",DateTime.Now.AddMinutes(10));

            objectobj = mc.Get("key1");

            Console.WriteLine(obj);

            Console.ReadKey();

        }


叢集問題Memcache儲存資料的原理

        先把key做一個雜湊演算法,得到雜湊值;雜湊值除以memcache伺服器個數,取餘,得出存放資料的伺服器

一致性雜湊原理

        臨時增加一個memcache伺服器,則之前key-value存放的伺服器就會發生變化,此時取之前的值就會出現問題;此時,我們可以使用一致性雜湊原理:每個伺服器對應的是一段值,此時增加一個伺服器,出現錯誤的概略會減少,但是,沒有辦法根治


記憶體儲存管理記憶體配置

        Memcache把記憶體分成大小不同的塊,當資料來了後,找到一個最小匹配上塊,來儲存資料

記憶體使用量

        採用CAS(CAS: ClientAssessService)協議,而不是採用鎖,解決多並發訪問題

        用戶端讀取資料時,獲得一個CAS-ID,當寫入緩衝前,先檢查用戶端CAS-ID和伺服器端CAS-ID(最後一個用戶端訪問時的CAS-ID)是否相同,相同,可以修改,否則,不允許修改,這個和我們使用的版本控制的原理大致是一樣的

記憶體回收Lazy Expiration(惰性檢測)

        當使用者通過key擷取資料時才檢查資料是否到期,最長到期時間為30d

LRU(Least RecentlyUsed)

        演算法:近期最少使用演算法。閑置記憶體—》到期記憶體—》最少使用


Memcache和Redis的區別

       都是分布式緩衝;官方提供Linux版,但都不提供win版;都可以實現叢集的,只不過,Memecache是在用戶端設定,而Redis是在伺服器端設定;Memcache提供的儲存類型單一,Redis提供的類型比較豐富;提供了很多種語言的驅動。


總結

       Memcache和Redis伺服器都是分布式緩衝思想的具體化,使用他們,可以使我們的web應用程式高效的被更多的使用者使用。

分布式緩衝Memcache和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.