memcache簡介
1. memcache是什么
memcache是一個高性能的分布式的內存對象緩存系統,用於動態Web應用以減輕數據庫負擔。它通過在內存中緩存數據和對象,來減少讀取數據庫的次數。從而提高動態、數據庫驅動網站速度。
memcache通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。memcache主要用於分擔數據庫負的壓力,memcache將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度。
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不會互相通信以共享信息。那么,怎么進行分布呢?這完全取決於客戶端 實現。