針對於現在計算機的cpu和網路設施,對應用程式來說,執行效率的瓶頸,已經不是**的長度(實現同乙個功能)和頻寬了,而是,**訪問資源的過程,即:讓我們的程式慢下來的罪魁禍首就是io操作。
程式從硬碟上讀取資料是乙個非常花費時間的操作,因為我們現在所使用的硬碟是機械式的,你想機械的執行速度和電的速度,那是乙個級別上的選手嗎?
為了解決程式的瓶頸,人們提出了一種想法:使用空間換取時間。程式訪問硬碟用的時間長,那就讓資料放到記憶體中,讓程式訪問記憶體,這樣不就節省了時間。這樣確實剩下了我們程式獲取資料時的等待時間,但是,我們的記憶體卻是被占用了。
我們大家都知道,記憶體這個資源對於計算機來說,是非常緊缺和有限的(就那麼多),如果我們計算機的記憶體資源都被這些資料使用了,那麼一定會影響我們程式的執行的,你想,如果此時程式再需要一片記憶體空間的話,計算機會有什麼反應,不用說,一定進行虛擬記憶體處理,虛擬記憶體是什麼?硬碟上的空間,你看,我們費了半天勁又繞到了這個瓶頸,這不得不償失嘛。
當然,上面的那種情況是程式和快取資料共用乙個計算機的記憶體,如果,這個程式使用的人少,那麼程式和快取資料在乙個計算機上只有積極的影響,沒有負面的影響,但是,如果我們程式推廣出去了,而且被所有人所接受,致使我們伺服器每一分鐘都有10萬使用者的訪問量,此時,上述的那種情況就會嚴重影響程式的效率了。
為了解決上述的問題,於是出現了分布式快取,硬碟上的資料,快取在別的計算機(不是程式執行的計算機)的記憶體上,而且,可以快取的計算機的個數不止乙個,可以是n個。這個就是本篇部落格的主要內容:分布式快取memcache(主講)和redis(做個簡介)
程式設計**如下:
static
voidmain(string args)
;集群stringservers = ; //
初始化物件池
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;
"test1";//
獲得指定物件池的物件
mc.set("key1","value1",datetime.now.addminutes(10));
objectobj = mc.get("key1");
console.writeline(obj);
console.readkey(); }
先把key做乙個雜湊演算法,得到雜湊值;雜湊值除以memcache伺服器個數,取餘,得出存放資料的伺服器
臨時增加乙個memcache伺服器,則之前key-value存放的伺服器就會發生變化,此時取之前的值就會出現問題;此時,我們可以使用一致性雜湊原理:每個伺服器對應的是一段值,此時增加乙個伺服器,出現錯誤的概略會減少,但是,沒有辦法**
memcache把記憶體分成大小不同的塊,當資料來了後,找到乙個最小匹配上塊,來儲存資料
採用cas(cas: clientassessservice)協議,而不是採用鎖,解決多併發訪問題
客戶端讀取資料時,獲得乙個cas-id,當寫入快取前,先檢查客戶端cas-id和伺服器端cas-id(最後乙個客戶端訪問時的cas-id)是否相同,相同,可以修改,否則,不允許修改,這個和我們使用的版本控制的原理大致是一樣的
當使用者通過key獲取資料時才檢查資料是否過期,最長過期時間為30d
演算法:近期最少使用演算法。閒置記憶體—》過期記憶體—》最少使用
都是分布式快取;官方提供linux版,但都不提供win版;都可以實現集群的,只不過,memecache是在客戶端設定,而redis是在伺服器端設定;memcache提供的儲存型別單一,redis提供的型別比較豐富;提供了很多種語言的驅動。
memcache和redis伺服器都是分布式快取思想的具體化,使用他們,可以使我們的web應用程式高效的被更多的使用者使用。
分布式快取 memcache學習
1.使用分布式快取是為了解決多台機器共享資訊的問題,通過訪問乙個ip和埠來可以訪問不同的iis伺服器 2.memcache基礎原理 在socket伺服器端儲存資料是以鍵值對的形式儲存 記憶體處理的演算法 本質就是乙個大的雜湊表。key最大長度是255個字元,value最大為1mb 記憶體模型 mem...
memcache的分布式快取問題
有關使用memcache做分布式快取的方案,簡單寫下來,僅供參考。memcache是優異的快取解決方案,很多專案都有使用。memcache服務本身並不具備分布式快取的能力,它提供的就是對對的訪問能力,分布式的能力則完全來自於客戶端。現在有不少memcache的客戶端lib採用consistent h...
memcache的分布式快取問題
memcache的分布式快取問題 memcache是優異的快取解決方案,很多專案都有使用。memcache服務本身並不具備分布式快取的能力,它提供的就是對對的訪問能力,分布式的能力則完全來自於客戶端。基於consistent hashing演算法的分布式快取 現在有不少memcache的客戶端lib...