分布式快取Memcache和Redis

2021-06-26 16:08:23 字數 2295 閱讀 2342

針對於現在計算機的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...