memcache簡單介紹

2021-08-07 13:08:50 字數 4150 閱讀 2986

1.  memcache是什麼

memcache是乙個高效能的分布式的記憶體物件快取系統,用於動態web應用以減輕資料庫負擔。它通過在記憶體中快取資料和物件,來減少讀取資料庫的次數。從而提高動態、資料庫驅動**速度。

2.  為什麼會有memcache和memcached兩種名稱?

memcache是這個專案的名稱,而memcached是它伺服器端的主程式檔名。

memcache可以應對任意多個連線,使用非阻塞的網路io。由於它的工作機制是在記憶體中開闢一塊空間,然後建立乙個hashtable,memcached自管理這些hashtable。

使用memcache的**一般流量都是比較大的,為了緩解資料庫的壓力,讓memcache作為乙個快取區域,把部分資訊儲存在記憶體中,在前端能夠迅速的進行訪問。那麼一般的焦點就是集中在如何分擔資料庫壓力和進行分布式,畢竟單台memcache的記憶體容量的有限的。

3. 操作流程:

1、檢查客戶端的請求資料是否在memcached中,如有,直接把請求資料返回,不再對資料庫進行任何操作,路徑操作為①②③⑦。

2、如果請求的資料不在memcached中,就去查資料庫,把從資料庫中獲取的資料返回給客戶端,同時把資料快取乙份到memcached中(memcached客戶端不負責,需要程式明確實現),路徑操作為①②④⑤⑦⑥。

3、每次更新資料庫的同時更新memcached中的資料,保證一致性。

4、當分配給memcached記憶體空間用完之後,會使用lru(least recently used,最近最少使用)策略加上到期失效策略,失效資料首先被替換,然後再替換掉最近未使用的資料。

4. memcache使用場景:

(1) 訪問頻繁的字典資料

(2) 大量的hot資料

(3) 頁面快取

(4) 頻繁的查詢條件和結果

(5) 臨時處理的資料

5. memcache的工作原理:

首先memcached是以守護程式方式執行於乙個或多個伺服器中,隨時接受客戶端的連線操作。

客戶端在與memcached服務建立連線之後,接下來的事情就是訪問物件了,每個被訪問的物件都有乙個唯一的識別符號key,訪問操作均通過這個key進行,儲存到memcached中的物件實際上是放置記憶體中的,並不是儲存cache檔案中的,這也是為什麼memcached能夠如此高效快速的原因。注意,這些物件並不是持久的,服務停止之後,裡邊的資料就會丟失。

memcache採用了c/s的模式,在server端啟動服務程序,在啟動時可以指定監聽的ip、自己的埠號,所使用的記憶體大小等幾個關鍵引數。一旦啟動,服務就一直處於可用狀態。

memcached 的目前版本是通過c實現,採用了單程序、單執行緒、非同步i/o,基於事件(event_based)的服務方式.使用libevent作為事件通知實現。多個server可以協同工作,但這些 server 之間是沒有任何通訊聯絡的,每個server只是對自己的資料進行管理。client端通過指定server端的ip位址(通過網域名稱應該也可以)。需要快取的物件或資料是以key->value對的形式儲存在server端。key的值通過hash進行轉換,根據hash值把value傳遞到對應的具體的某個server上。當需要獲取物件資料時,也根據key進行。首先對key進行hash,通過獲得的值可以確定它被儲存在了哪台server上,然後再向該server發出請求。client端只需要知道儲存hash(key)的值在哪台伺服器上就可以了。

memcache 的工作就是在專門的機器的記憶體裡維護一張巨大的 hash 表,來儲存經常被讀寫的一些陣列與檔案,從而極大的提高**的執行效率。

說白了memcache是一種記憶體快取技術,是一種快取手段,要看情況來使用。

對於頻繁讀取,每次讀取重複率高,資料更新頻度低的資料,用memcache可以優化你的系統響應速度。

內建記憶體儲存方式:

為了提高效能,memcached中儲存的資料都儲存在memcache內建的記憶體儲存空間中。由於資料僅存在於記憶體中,因此,重啟memcached、重啟作業系統就會導致全部資料消失。另外,內容容量達到指定值之後,就基於lru(least recently used)演算法自動刪除不使用的快取。memcached本身是為快取而設計的伺服器,因此並沒有過多考慮資料的永久性問題。

memcached的記憶體演算法:

memcached利用slab allocation機制來分配和管理記憶體,它按照預先規定的大小,將分配的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,資料在存放時,根據鍵值大小去匹配slab大小,找就近的slab存放,所以存在空間浪費現象。

傳統的記憶體管理方式是,使用完通過malloc分配的記憶體後通過free來**記憶體,這種方式容易產生記憶體碎片並降低作業系統對記憶體的管理效率。

memcached的快取策略:

memcached的快取策略是lru(最近最少使用)加上到期失效策略。當你在memcached內儲存資料項時,你有可能會指定它在快取的失效時間,預設為永久。當memcached伺服器用完分配的內時,失效的資料被首先替換,然後也是最近未使用的資料。在lru中,memcached使用的是一種lazy expiration策略,自己不會監控存入的key/vlue對是否過期,而是在獲取key值時檢視記錄的時間戳,檢查key/value對空間是否過期,這樣可減輕伺服器的負載。

memcached的分布式演算法:

當向memcached集群存入/取出key/value時,memcached客戶端程式根據一定的演算法計算存入哪台伺服器,然後再把key/value值存到此伺服器中。也就是說,訪問資料分二步走,第一步,選擇伺服器,第二步訪問資料。

分布式演算法(consistent hashing):

選擇伺服器演算法有兩種,一種是根據餘數來計算分布,另一種是根據雜湊演算法來計算分布。

餘數演算法:

先求得鍵的整數雜湊值,再除以伺服器台數,根據餘數確定訪問伺服器,這種方法計算簡單,高效,但在memcached伺服器增加或減少時,幾乎所有的快取都會失效。

雜湊演算法:

先算出memcached伺服器的雜湊值,並將其分布到0到2的32次方的圓上,然後用同樣的方法算出儲存資料的鍵的雜湊值並對映至圓上,最後從資料對映到的位置開始順時針查詢,將資料儲存到查詢到的第乙個伺服器上,如果超過2的32次方,依然找不到伺服器,就將資料儲存到第一台memcached伺服器上。如果新增了一台memcached伺服器,只在圓上增加伺服器的逆時針方向的第一台伺服器上的鍵會受到影響。

memcached不互相通訊的分布式:

memcached儘管是「分布式」快取伺服器,但伺服器並沒有分布式功能。各個memcached不會互相通訊以共享資訊。那麼,怎麼進行分布呢?這完全取決於客戶端 實現。

Memcache 介紹與部署

memcache 介紹與部署 1 啟動memcache的伺服器端 usr local bin memcached d m 100 u root l 127.0.0.1 p 12000 c 300 p tmp mem cached.pid d選項是啟動乙個守護程序,m是分配給memcache使用的記憶...

Memcache介紹 安裝 使用(四)

memcached雖然成為 分布式 伺服器,但是服務端根本沒有 分布式 功能,而是完全有客戶端實現所謂的 分布式 假設有node1,node2,node3三颱memcache快取伺服器,有五個不同的key值需要儲存。首先向memcache新增第乙個key tokyo 客戶端接收到key後,客戶端實現...

PHP操作Memcache例項介紹

b s 基於瀏覽器和伺服器架構 web程式 c s qq svn client客戶端 伺服器 簡單的基於文字行的協議 redis memcache 區別 都是儲存資料的,memcache直接儲存到記憶體中,redis 儲存到記憶體中,關閉之後儲存到硬碟中,memcache 重啟電腦,關閉服務都會造成...