MemCache

MemCache

高性能的分布式的内存對象緩存系統
Memcache是一個高性能的分布式的内存對象緩存系統,以守護程序方式運行于一個或多個服務器中,随時接收客戶端的連接和操作。[1]Memcache是大型網站用來提高網站訪問速度的有效手段,但現在針對memcache安全性的研究分析還基本上沒有。[2]這是一套開放源代碼軟件,以BSD license授權發布。
    中文名:MemCache 外文名: 别名: 特點:分布式的高速緩存系統 開發:LiveJournal的Brad Fitzpatrick 類型:開放源代碼軟件

解析

MemCache的工作流程如下:先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對數據庫進行任何操作;如果請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,需要程序明确實現);每次更新數據庫的同時更新memcached中的數據,保證一緻性;當分配給memcached内存空間用完之後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,然後再替換掉最近未使用的數據。

Memcache是一個高性能的分布式的内存對象緩存系統,通過在内存裡維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是将數據調用到内存中,然後從内存中讀取,從而大大提高讀取速度。

Memcache是danga的一個項目,最早是LiveJournal服務的,最初為了加速LiveJournal訪問速度而開發的,後來被很多大型的網站采用。

Memcached是以守護程序(監聽)方式運行于一個或多個服務器中,随時會接收客戶端的連接和操作。

特性和限制

在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是一種無阻塞的socket通信方式服務,基于libevent庫,由于無阻塞通信,對内存讀寫速度非常之快。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客戶端包含兩組接口,一組是面向過程的接口,一組是面向對象的接口,具體可以參考PHP手冊

MemCache“LXXV. Memcache Functions”這章。

Memcache面向對象的常用接口包括:

Memcache::connect--打開一個到Memcache的連接

Memcache::pconnect--打開一個到Memcache的長連接

Memcache::close--關閉一個Memcache的連接

Memcache::set--保存數據到Memcache服務器上

Memcache::get--提取一個保存在Memcache服務器上的數據

Memcache::replace--替換一個已經存在Memcache服務器上的項目(功能類似Memcache::set)

Memcache::delete--從Memcache服務器上删除一個保存的項目

Memcache::flush--刷新所有Memcache服務器上保存的項目(類似于删除所有的保存的項目)

Memcache::getStats--獲取當前Memcache服務器運行的狀态

協議分析

如果你不喜歡php_memcache.dll擴展或者服務器目前不支持這個擴展,那麼就可以考慮自己構建.

Memcahe的客戶端,要先了解Memcache協議的交互,這樣才能開發自己的客戶端,這裡簡單的分析一下Memcache的協議。(更詳細的協議内容請在Memcache服務器端的源碼的doc/protocol.txt文件中)

Memcache既支持TCP協議,也支持UDP協議,不過我們這裡是以TCP協議的協議作為主要考慮對象,想了解UDP協議的過程,請參考doc/protocol.txt文件。

[錯誤指令]

Memcache的協議的錯誤部分主要是三個錯誤提示指令:

普通錯誤信息,比如指令錯誤之類的

ERROR

客戶端錯誤

CLIENT_ERROR<錯誤信息>

服務器端錯誤

SERVER_ERROR<錯誤信息>

[數據保存指令]

數據保存是基本的功能,就是客戶端通過命令把數據返回過來,服務器端接收後進行處理。

指令格式:

<命令><鍵><标記><有效期><數據長度>

<命令>-command name

主要是三個儲存數據的三個命令,set,add,replace

set命令是保存一個叫做key的數據到服務器上

add命令是添加一個數據到服務器,但是服務器必須保證這個key是不存在的,能夠保證數據不會被覆蓋

replace命令是替換一個已經存在的數據,如果數據不存在,就是類似set功能

<鍵>-key

就是保存在服務器上唯一的一個表示符,必須是跟其他的key不沖突,否則會覆蓋掉原來的數據,這個key是為了能夠準确的存取一個數據項目

<标記>-flag

标記是一個16位的無符号整形數據,用來設置服務器端跟客戶端一些交互的操作

<有效期>-expiration time

是數據在服務器上的有效期限,如果是0,則數據永遠有效,單位是秒,Memcache服務器端會把一個數據的有效期設置為當前Unix時間+設置的有效時間

<數據長度>-bytes

數據的長度,block data 塊數據的長度,一般在這個個長度結束以後下一行跟着block data數據内容,發送完數據以後,客戶端一般等待服務器端的返回。

數據保存成功

STORED

數據保存失敗,一般是因為服務器端這個數據key已經存在了

NOT_STORED

[數據提取命令]

從服務器端提取數據主要是使用get指令,格式是:

get<鍵>*

<鍵>*-key

key是一個不為空的字符串組合,發送這個指令以後,等待服務器的返回。如果服務器端沒有任何數據,則是返回:

END

證明沒有不存在這個key,沒有任何數據,如果存在數據,則返回指定格式:

VALUE<鍵><标記><數據長度>

<數據塊>

返回的數據是以VALUE開始的,後面跟着key和flags,以及數據長度,第二行跟着數據塊。

<鍵>-key

是發送過來指令的key内容

<标記>-flags

是調用set指令保存數據時候的flags标記

<數據長度>-bytes

是保存數據時候定位的長度

<數據塊>-data block

數據長度下一行就是提取的數據塊内容

[數據删除指令]

數據删除指令也是比較簡單的,使用delete指令,格式是:

delete<鍵><超時時間>

<鍵>-key

key是你希望在服務器上删除數據的key鍵

<超時時間>-timeout

按照秒為單位,這個是個可選項,如果你沒有指定這個值,那麼服務器上key數據将馬上被删除,如果設置了這個值,那麼數據将在超時時間後把數據清除,該項缺省值是0,表示永不過期。

删除數據後,服務器端會返回:

DELETED

删除數據成功

NOT_FOUND

這個key沒有在服務器上找到

如果要删除所有服務器上的數據,可以使用flush_all指令,格式:

flush_all

這個指令執行後,服務器上所有緩存的數據都被删除,并且返回:

OK

這個指令一般不要輕易使,除非你确實想把所有數據都幹掉,删除完以後可以無法恢複的。

[其他指令]

如果想了解當前Memcache服務器的狀态和版本等信息,可以使用狀态查詢指令和版本查詢指令。

如果想了解當前所有Memcache服務器運行的狀态信息,可以使用stats指令,格式

stats

服務器将返回每行按照STAT開始的狀态信息,包括20行,20項左右的信息,包括守護進程的pid、版本、保存的項目數量、内存占用、最大内存限制等等信息。

如果隻是想獲取部分項目的信息,可以指定參數,格式:

stats<參數>

這個指令将隻返回指定參數的項目狀态信息。

如果隻是想單獨了解當前版本信息,可以使用version指令,格式:

version

将返回以VERSION開頭的版本信息

如果想結束當前連接,使用quit指令,格式:

quit

将斷開當前連接

另外還有其他指令,包括incr,decr等,我也不太了解作用,就不做介紹了,如果感興趣,可以自己去研究。

應用

使用Memcache的網站一般流量都是比較大的,為了緩解數據庫的壓力,讓Memcache作為一個緩存區域,把部分信息保存在内存中,在前端能夠迅速的進行存取。那麼一般的焦點就是集中在如何分擔數據庫壓力和進行分布式,畢竟單台Memcache的内存容量的有限的。

[分布式應用]

Memcache本來支持分布式,我們客戶端稍加改造,更好的支持。我們的key可以适當進行有規律的封裝,比如以user為主的網站來說,每個用戶都有UserID,那麼可以按照固定的ID來進行提取和存取,比如1開頭的用戶保存在第一台Memcache服務器上,以2開頭的用戶的數據保存在第二台Memcache服務器上,存取數據都先按照User ID來進行相應的轉換和存取。

但是這個有缺點,就是需要對User ID進行判斷,如果業務不一緻,或者其他類型的應用,可能不是那麼合适,那麼可以根據自己的實際業務來進行考慮,或者去想更合适的方法。

[減少數據庫壓力]

這個算是比較重要的,所有的數據基本上都是保存在數據庫當中的,每次頻繁的存取數據庫,導緻數據庫性能急劇下降,無法同時服務更多的用戶,比如MySQL,特别頻繁的鎖表,那麼讓Memcache來分擔數據庫的壓力吧。我們需要一種改動比較小,并且能夠不會大規模改變前端的方式來進行改變目前的架構。

一個用PHP編寫的可視化的MemCached管理系統

MemAdmin是一款可視化的Memcached管理與監控工具,使用PHP開發,體積小,操作簡單。

主要功能:

服務器參數監控:STATS、SETTINGS、ITEMS、SLABS、SIZES實時刷新;

服務器性能監控:GET、DELETE、INCR、DECR、CAS等常用操作命中率實時監控;

支持數據遍曆,方便對存儲内容進行監視;

支持條件查詢,篩選出滿足條件的KEY或VALUE;

數組、JSON等序列化字符反序列顯示;

兼容memcache協議的其他服務,如Tokyo Tyrant(遍曆功能除外);

支持服務器連接池,多服務器管理切換方便簡潔。

攻擊事件

2018年3月1日,360網絡安全響應中心(360 Cert)發出預警,稱監測到一種利用Memcache作為DRDoS放大器進行放大的超大規模DDoS攻擊,這種反射型DDoS攻擊能夠達到5萬倍的放大系數,犯罪分子可利用Memcache服務器通過非常少的計算資源發動超大規模的DDoS攻擊。

相關詞條

相關搜索

其它詞條