標籤: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