memcache是一套分散式的高速快取系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問資料庫的網站訪問速度提升效果十分顯著。這是一套開放原始碼軟體,以BSD license授權發布。
基本介紹
- 外文名:MemCache
- 特點:分散式的高速快取系統
- 開發:LiveJournal的Brad Fitzpatrick
- 類型:開放原始碼軟體
解析,特性和限制,接口介紹,協定分析,套用,攻擊事件,
解析
MemCache的工作流程如下:先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對資料庫進行任何操作;如果請求的數據不在memcached中,就去查資料庫,把從資料庫中獲取的數據返回給客戶端,同時把數據快取一份到memcached中(memcached客戶端不負責,需要程式明確實現);每次更新資料庫的同時更新memcached中的數據,保證一致性;當分配給memcached記憶體空間用完之後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,然後再替換掉最近未使用的數據。
Memcache是一個高性能的分散式的記憶體對象快取系統,通過在記憶體里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、檔案以及資料庫檢索的結果等。簡單的說就是將數據調用到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
Memcache是danga的一個項目,最早是LiveJournal 服務的,最初為了加速 LiveJournal 訪問速度而開發的,後來被很多大型的網站採用。
特性和限制
在 Memcached中可以保存的item數據量是沒有限制的,只要記憶體足夠 。
Memcached單進程在32位系統中最大使用記憶體為2G,若在64位系統則沒有限制,這是由於32位系統限制單進程最多可使用2G記憶體,要使用更多記憶體,可以分多個連線埠開啟多個Memcached進程 ,
最大30天的數據過期時間,設定為永久的也會在這個時間過期,常量REALTIME_MAXDELTA
60*60*24*30控制
最大鍵長為250位元組,大於該長度無法存儲,常量KEY_MAX_LENGTH 250控制
單個item最大數據是1MB,超過1MB數據不予存儲,常量POWER_BLOCK 1048576進行控制,
它是默認的slab大小
最大同時連線數是200,通過 conn_init()中的freetotal進行控制,最大軟連線數是1024,通過
settings.maxconns=1024 進行控制
跟空間占用相關的參數:settings.factor=1.25, settings.chunk_size=48, 影響slab的數據占用和步進方式
Memcached單進程在32位系統中最大使用記憶體為2G,若在64位系統則沒有限制,這是由於32位系統限制單進程最多可使用2G記憶體,要使用更多記憶體,可以分多個連線埠開啟多個Memcached進程 ,
最大30天的數據過期時間,設定為永久的也會在這個時間過期,常量REALTIME_MAXDELTA
60*60*24*30控制
最大鍵長為250位元組,大於該長度無法存儲,常量KEY_MAX_LENGTH 250控制
單個item最大數據是1MB,超過1MB數據不予存儲,常量POWER_BLOCK 1048576進行控制,
它是默認的slab大小
最大同時連線數是200,通過 conn_init()中的freetotal進行控制,最大軟連線數是1024,通過
settings.maxconns=1024 進行控制
跟空間占用相關的參數:settings.factor=1.25, settings.chunk_size=48, 影響slab的數據占用和步進方式
memcached是一種無阻塞的socket通信方式服務,基於libevent庫,由於無阻塞通信,對記憶體讀寫速度非常之快。
memcached分伺服器端和客戶端,可以配置多個伺服器端和客戶端,套用於分散式的服務非常廣泛。
memcached作為小規模的數據分散式平台是十分有效果的。
memcached分伺服器端和客戶端,可以配置多個伺服器端和客戶端,套用於分散式的服務非常廣泛。
memcached作為小規模的數據分散式平台是十分有效果的。
memcached是鍵值一一對應,key默認最大不能超過128個字 節,value默認大小是1M,也就是一個slabs,如果要存2M的值(連續的),不能用兩個slabs,因為兩個slabs不是連續的,無法在記憶體中 存儲,故需要修改slabs的大小,多個key和value進行存儲時,即使這個slabs沒有利用完,那么也不會存放別的數據。
memcached已經可以支持C/C++、Perl、PHP、Python、Ruby、Java、C#、Postgres、Chicken Scheme、Lua、MySQL和Protocol等語言客戶端。
接口介紹
MemCache“LXXV. Memcache Functions” 這章。
Memcache面向對象的常用接口包括:
Memcache::connect -- 打開一個到Memcache的連線
Memcache::pconnect -- 打開一個到Memcache的長連線
Memcache::close -- 關閉一個Memcache的連線
Memcache::set -- 保存數據到Memcache伺服器上
Memcache::delete -- 從Memcache伺服器上刪除一個保存的項目
Memcache::flush -- 刷新所有Memcache伺服器上保存的項目(類似於刪除所有的保存的項目)
Memcache::getStats -- 獲取當前Memcache伺服器運行的狀態
協定分析
Memcahe的客戶端,要先了解Memcache協定的互動,這樣才能開發自己的客戶端,這裡簡單的分析一下Memcache的協定。(更詳細的協定內容請在Memcache伺服器端的源碼的 doc/protocol.txt檔案中)
[ 錯誤指令]
Memcache的協定的錯誤部分主要是三個錯誤提示指令:
普通錯誤信息,比如指令錯誤之類的
ERROR
客戶端錯誤
CLIENT_ERROR <錯誤信息>
伺服器端錯誤
SERVER_ERROR <錯誤信息>
[ 數據保存指令]
指令格式:
<命令> <鍵> <標記> <有效期> <數據長度>
<命令> - command name
主要是三個儲存數據的三個命令, set, add, replace
add 命令是添加一個數據到伺服器,但是伺服器必須保證這個key是不存在的,能夠保證數據不會被覆蓋
replace 命令是替換一個已經存在的數據,如果數據不存在,就是類似set功能
<鍵> - key
<標記> - flag
<有效期> - expiration time
是數據在伺服器上的有效期限,如果是0,則數據永遠有效,單位是秒,Memcache伺服器端會把一個數據的有效期設定為當前Unix時間+設定的有效時間
<數據長度> - bytes
數據保存成功
STORED
NOT_STORED
[ 數據提取命令]
get <鍵>*
<鍵>* -key
END
VALUE <鍵> <標記> <數據長度>
<數據塊>
<鍵> -key
<標記> - flags
<數據長度> - bytes
是保存數據時候定位的長度
<數據塊> - data block
[ 數據刪除指令]
delete <鍵> <逾時時間>
<鍵> - key
<逾時時間> - timeout
DELETED
刪除數據成功
NOT_FOUND
flush_all
OK
這個指令一般不要輕易使,除非你確實想把所有數據都幹掉,刪除完以後可以無法恢復的。
[其他指令]
stats
stats <參數>
version
將返回以 VERSION 開頭的版本信息
quit
將斷開當前連線
另外還有其他指令,包括incr, decr 等,我也不太了解作用,就不做介紹了,如果感興趣,可以自己去研究。
套用
使用Memcache的網站一般流量都是比較大的,為了緩解資料庫的壓力,讓Memcache作為一個快取區域,把部分信息保存在記憶體中,在前端能夠迅速的進行存取。那么一般的焦點就是集中在如何分擔資料庫壓力和進行分散式,畢竟單台Memcache的記憶體容量的有限的。
[分散式套用]
Memcache本來支持分散式,我們客戶端稍加改造,更好的支持。我們的key可以適當進行有規律的封裝,比如以user為主的網站來說,每個用戶都有UserID,那么可以按照固定的ID來進行提取和存取,比如1開頭的用戶保存在第一台Memcache伺服器上,以2開頭的用戶的數據保存在第二台Memcache伺服器上,存取數據都先按照User ID來進行相應的轉換和存取。
[ 減少資料庫壓力]
這個算是比較重要的,所有的數據基本上都是保存在資料庫當中的,每次頻繁的存取資料庫,導致資料庫性能急劇下降,無法同時服務更多的用戶,比如MySQL,特別頻繁的鎖表,那么讓Memcache來分擔資料庫的壓力吧。我們需要一種改動比較小,並且能夠不會大規模改變前端的方式來進行改變目前的架構。
一個用PHP編寫的可視化的MemCached管理系統
MemAdmin是一款可視化的Memcached管理與監控工具,使用PHP開發,體積小,操作簡單。
主要功能: