分布式快取 memcache學習

2021-09-06 11:15:47 字數 3597 閱讀 2294

1.使用分布式快取是為了解決多台機器共享資訊的問題,通過訪問乙個ip和埠來可以訪問不同的iis伺服器

2.memcache基礎原理

在socket伺服器端儲存資料是以鍵值對的形式儲存

記憶體處理的演算法: 本質就是乙個大的雜湊表。

key最大長度是255個字元,value最大為1mb 記憶體模型:memcache預先將可支配的記憶體空間進行分割槽(slab),每個分割槽裡再分成多個塊(chunk)最大1mb,但同乙個分割槽裡:塊的長度(bytes)是固定的。

插入資料:查詢適合自己長度的塊,然後插入,會有記憶體浪費。 lru,閒置》過期  >最少訪問    

惰性刪除:它並沒有提供監控資料過期的機制,而是惰性的,當查詢到某個key資料時,如果過期那麼直接拋棄。

集群搭建原理: memcache伺服器端並沒有提供集群功能,但是通過客戶端的驅動程式實現了集群配置。

客戶端實現集群的原理:首先客戶端配置多台集群機器的ip和埠的列表。然後客戶端驅動程式在寫入之前,首先對key做雜湊處理得到雜湊值後對總的機器的個數進行取餘然後就選擇餘數對應的機器。 memcache預先將可支配的記憶體空間進行分割槽(slab),每個分割槽裡再分成多個塊(chunk),但同乙個分割槽裡:塊的長度(bytes)是固定的。 將記錄從memcache刪除後,已經分配的記憶體(即chunk),也不會被釋放,而是會重複利用,這樣就徹底解決了記憶體碎片的問題 memcache採用「惰性」方式來應對記錄的超期問題

3.windows下使用memcache

安裝服務:cmd→memcached.exe -d install 開啟服務監控視窗可以檢視服務是否啟動。

啟動服務:cmd→memcached.exe -d start(restart重啟,stop關閉服務)

檢查服務是否啟動:連線到memcache控制台:telnet serverip 11211  輸入命令:stats檢查當前服務狀態。

解除安裝服務:memcached.exe -d uninstall

將memcache.exe安裝為windows服務:memcache.exe -d install

啟動memcache服務:memcache.exe -d start

啟動memcache服務(windows命令):net start "memcache server"

停止memcache服務(windows命令):net stop "memcache server"

連線到memcache控制台:telnet serverip 11211

列印當前memcache伺服器狀態:stats

列印當前memcache伺服器items(記錄)的統計資訊:stats items

列印當前memcache伺服器slab(分割槽)及chunk(塊)的統計資訊:stats slabs

列印指定slab中的key列表(可用於遍歷items,但效率較低,慎用!):stats cachedump slabid limit_num。

顯示結果:item keyname [valuebytelength b; lastaccesstime s]。值得注意的是,經過測試確認:那個lastaccesstime並不是記錄到期時間,而是最後一次的get時間,並且get之後,也不會自動延長expiry(到期時間)。

新增新記錄:add keyname 0 0 valuebytelength [回車] valuecontent

刪除記錄 : delete keyname

新增或更新記錄 : set keyname 0 0 valuebytelength [回車] valuecontent

更新記錄 : replace keyname 0 0 valuebytelength [回車] valuecontent

參考:也可以使用 (提取碼:8c12),將服務直接安裝到電腦上,

1) 解壓到d:\memcached。

2) 在命令列狀態下輸入: d:\memcached\memcached.exe -d install 。至此memcached已經安裝成windows服務

3) 在命令列下輸入: d:\memcached\memcached.exe -d start 以啟動memcached服務。當然也可以選擇在windows服務中啟動。

4.c#操作memcache 引用類庫檔案

封裝memcachedhelper類

public static class memcachehelper

private static memcachedclient mc;

static memcachehelper()

string serverlist = ;

// initialize the pool for memcache servers  

sockiopool pool = sockiopool.getinstance("test");  

pool.setservers(serverlist);  

pool.initialize();  

mc = new memcachedclient();  

mc.poolname = "test";  

mc.enablecompression = false;  

public static bool set(string key, object value,datetime expiry)

return mc.set(key, value, expiry);

public static object get(string key)

return mc.get(key);

使用方法 

memcachehelper.set("key", "value", datetime.now.addminutes(20));

memcachehelper.get("key");

5.cookie+memcache模擬session保持登入狀態

guid sessionid = guid.newguid();//申請了乙個模擬的guid:sessionid

//把sessionid寫到客戶端瀏覽器裡面去

response.cookies["sessionid"].value = sessionid.tostring();

memcachehelper.set(sessionid.tostring(), loginuser, datetime.now.addminutes(20));

//從cookie中獲取咱們的 登入的sessionid

string sessionid = request["sessionid"];

if (!string.isnullorempty(sessionid))

object obj = memcachehelper.get(sessionid);

userinfo user = obj as userinfo;

memcached資料: (提取碼:6d84)

memcache的分布式快取問題

有關使用memcache做分布式快取的方案,簡單寫下來,僅供參考。memcache是優異的快取解決方案,很多專案都有使用。memcache服務本身並不具備分布式快取的能力,它提供的就是對對的訪問能力,分布式的能力則完全來自於客戶端。現在有不少memcache的客戶端lib採用consistent h...

分布式快取Memcache和Redis

針對於現在計算機的cpu和網路設施,對應用程式來說,執行效率的瓶頸,已經不是 的長度 實現同乙個功能 和頻寬了,而是,訪問資源的過程,即 讓我們的程式慢下來的罪魁禍首就是io操作。程式從硬碟上讀取資料是乙個非常花費時間的操作,因為我們現在所使用的硬碟是機械式的,你想機械的執行速度和電的速度,那是乙個...

memcache的分布式快取問題

memcache的分布式快取問題 memcache是優異的快取解決方案,很多專案都有使用。memcache服務本身並不具備分布式快取的能力,它提供的就是對對的訪問能力,分布式的能力則完全來自於客戶端。基於consistent hashing演算法的分布式快取 現在有不少memcache的客戶端lib...