MemCache 分布式缓存
引用:http://baike.baidu.com/view/1193094.htm
Memcache是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護一個統(tǒng)一的巨大的hash表,它能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等。簡單的說就是將數(shù)據(jù)調(diào)用到內(nèi)存中,然后從內(nèi)存中讀取,從而大大提高讀取速度。
Memcache是danga的一個項目,最早是LiveJournal 服務(wù)的,最初為了加速 LiveJournal 訪問速度而開發(fā)的,后來被很多大型的網(wǎng)站采用。
Memcached是以守護程序方式運行于一個或多個服務(wù)器中,隨時會接收客戶端的連接和操作。
MemCache接口介紹
Memcache客戶端包含兩組接口,一組是面向過程的接口,一組是面向?qū)ο?span id="ozvdkddzhkzd" class="Apple-style-span" style="text-transform:none;text-indent:0px;font:14px/24px arial, '宋體', sans-serif;letter-spacing:normal;color:#000000;word-spacing:0px;">的接口,具體可以參考PHP手冊
MemCache“LXXV. Memcache Functions” 這章。
Memcache面向?qū)ο蟮某S媒涌诎?#xff1a;
Memcache::connect -- 打開一個到Memcache的連接
Memcache::pconnect -- 打開一個到Memcache的長連接
Memcache::close -- 關(guān)閉一個Memcache的連接
Memcache::set -- 保存數(shù)據(jù)到Memcache服務(wù)器上
Memcache::get -- 提取一個保存在Memcache服務(wù)器上的數(shù)據(jù)
Memcache::replace -- 替換一個已經(jīng)存在Memcache服務(wù)器上的項目(功能類似Memcache::set)
Memcache::delete -- 從Memcache服務(wù)器上刪除一個保存的項目
Memcache::flush -- 刷新所有Memcache服務(wù)器上保存的項目(類似于刪除所有的保存的項目)
Memcache::getStats -- 獲取當前Memcache服務(wù)器運行的狀態(tài)
MemCache 協(xié)議分析
如果你不喜歡 php_memcache.dll 擴展或者服務(wù)器目前不支持這個擴展,那么就可以考慮自己構(gòu)建.
Memcahe的客戶端,要先了解Memcache協(xié)議的交互,這樣才能開發(fā)自己的客戶端,這里簡單的分析以下Memcache的協(xié)議。(更詳細的協(xié)議內(nèi)容請在Memcache服務(wù)器端的源碼的 doc/protocol.txt 文件中)
Memcache既支持TCP協(xié)議,也支持UDP協(xié)議,不過我們這里是以TCP協(xié)議的協(xié)議作為主要考慮對象,想了解UDP協(xié)議的過程,請參考 doc/protocol.txt 文件。
[ 錯誤指令]
Memcache的協(xié)議的錯誤部分主要是三個錯誤提示之提示指令:
普通錯誤信息,比如指令錯誤之類的
ERROR\r\n
客戶端錯誤
CLIENT_ERROR <錯誤信息>\r\n
服務(wù)器端錯誤
SERVER_ERROR <錯誤信息>\r\n
[ 數(shù)據(jù)保存指令]
數(shù)據(jù)保存是基本的功能,就是客戶端通過命令把數(shù)據(jù)返回過來,服務(wù)器端接收后進行處理。
指令格式:
<命令> <鍵> <標記> <有效期> <數(shù)據(jù)長度>\r\n
<命令> - command name
主要是三個儲存數(shù)據(jù)的三個命令, set, add, replace
set 命令是保存一個叫做key的數(shù)據(jù)到服務(wù)器上
add 命令是添加一個數(shù)據(jù)到服務(wù)器,但是服務(wù)器必須這個key是不存在的,能夠保證數(shù)據(jù)不會被覆蓋
replace 命令是替換一個已經(jīng)存在的數(shù)據(jù),如果數(shù)據(jù)不存在,就是類似set功能
<鍵> - key
就是保存在服務(wù)器上唯一的一個表示符,必須是跟其他的key不沖突,否則會覆蓋掉原來的數(shù)據(jù),這個key是為了能夠準確的存取一個數(shù)據(jù)項目
<標記> - flag
標記是一個16位的無符號整形數(shù)據(jù),用來設(shè)置服務(wù)器端跟客戶端一些交互的操作
<有效期> - expiration time
是數(shù)據(jù)在服務(wù)器上的有效期限,如果是0,則數(shù)據(jù)永遠有效,單位是秒,Memcache服務(wù)器端會把一個數(shù)據(jù)的有效
MemCache
期設(shè)置為當前Unix時間 設(shè)置的有效時間
<數(shù)據(jù)長度> - bytes
數(shù)據(jù)的長度,block data 塊數(shù)據(jù)的長度,一般在這個個長度結(jié)束以后下一行跟著block data數(shù)據(jù)內(nèi)容,發(fā)送完數(shù)據(jù)以后,客戶端一般等待服務(wù)器端的返回,服務(wù)器端的返回:
數(shù)據(jù)保存成功
STORED\r\n
數(shù)據(jù)保存失敗,一般是因為服務(wù)器端這個數(shù)據(jù)key已經(jīng)存在了
NOT_STORED\r\n
[ 數(shù)據(jù)提取命令]
從服務(wù)器端提取數(shù)據(jù)主要是使用get指令,格式是:
get <鍵>*\r\n
<鍵>* - key
key是是一個不為空的字符串組合,發(fā)送這個指令以后,等待服務(wù)器的返回。如果服務(wù)器端沒有任何數(shù)據(jù),則是返回:
END\r\n
證明沒有不存在這個key,沒有任何數(shù)據(jù),如果存在數(shù)據(jù),則返回指定格式:
VALUE <鍵> <標記> <數(shù)據(jù)長度>\r\n
<數(shù)據(jù)塊>\r\n
返回的數(shù)據(jù)是以VALUE開始的,后面跟著key和flags,以及數(shù)據(jù)長度,第二行跟著數(shù)據(jù)塊。
<鍵> -key
是發(fā)送過來指令的key內(nèi)容
<標記> - flags
是調(diào)用set指令保存數(shù)據(jù)時候的flags標記
<數(shù)據(jù)長度> - bytes
是保存數(shù)據(jù)時候定位的長度
<數(shù)據(jù)塊> - data block
數(shù)據(jù)長度下一行就是提取的數(shù)據(jù)塊內(nèi)容
[ 數(shù)據(jù)刪除指令]
數(shù)據(jù)刪除指令也是比較簡單的,使用get指令,格式是:
delete <鍵> <超時時間>\r\n
<鍵> - key
key是你希望在服務(wù)器上刪除數(shù)據(jù)的key鍵
<超時時間> - timeout
按照秒為單位,這個是個可選項,如果你沒有指定這個值,那么服務(wù)器上key數(shù)據(jù)將馬上被刪除,如果設(shè)置了這個值,那么數(shù)據(jù)將在超時時間后把數(shù)據(jù)清除,該項缺省值是0,就是馬上被刪除
刪除數(shù)據(jù)后,服務(wù)器端會返回:
DELETED\r\n
刪除數(shù)據(jù)成功
NOT_FOUND\r\n
這個key沒有在服務(wù)器上找到
如果要刪除所有服務(wù)器上的數(shù)據(jù),可以使用flash_all指令,格式:
flush_all\r\n
這個指令執(zhí)行后,服務(wù)器上所有緩存的數(shù)據(jù)都被刪除,并且返回:
OK\r\n
這個指令一般不要輕易使,除非你卻是想把所有數(shù)據(jù)都干掉,刪除完以后可以無法恢復(fù)的。
[其他指令]
如果想了解當前Memcache服務(wù)器的狀態(tài)和版本等信息,可以使用狀態(tài)查詢指令和版本查詢指令。
如果想了解當前所有Memcache服務(wù)器運行的狀態(tài)信息,可以使用stats指令,格式
stats\r\n
服務(wù)器將返回每行按照 STAT 開始的狀態(tài)信息,包括20行,20項左右的信息,包括守護進程的pid、版本、保存的項目數(shù)量、內(nèi)存占用、最大內(nèi)存限制等等信息。
如果只是想獲取部分項目的信息,可以指定參數(shù),格式:
stats <參數(shù)>\r\n
這個指令將只返回指定參數(shù)的項目狀態(tài)信息。
如果只是想單獨了解當前版本信息,可以使用version指令,格式:
version\r\n
將返回以 VERSION 開頭的版本信息
如果想結(jié)束當前連接,使用quit指令,格式:
quit\r\n
將斷開當前連接
另外還有其他指令,包括incr, decr 等,我也不太了解作用,就不做介紹了,如果感興趣,可以自己去研究。
MemCache在中型網(wǎng)站中的應(yīng)用
使用Memcache的網(wǎng)站一般流量都是比較大的,為了緩解數(shù)據(jù)庫的壓力,讓Memcache作為一個緩存區(qū)域,把部分信息保存在內(nèi)存中,在前端能夠迅速的進行存取。那么一般的焦點就是集中在如何分擔數(shù)據(jù)庫壓力和進行分布式,畢竟單臺Memcache的內(nèi)存容量的有限的。我這里簡單提出我的個人看法,未經(jīng)實踐,權(quán)當參考。
[ 分布式應(yīng)用]
Memcache本來支持分布式,我們客戶端稍加改造,更好的支持。我們的key可以適當進行有規(guī)律的封裝,比如以user為主的網(wǎng)站來說,每個用戶都有UserID,那么可以按照固定的ID來進行提取和存取,比如1開頭的用戶保存在第一臺Memcache服務(wù)器上,以2開頭的用戶的數(shù)據(jù)保存在第二臺Mecache服務(wù)器上,存取數(shù)據(jù)都先按照User ID來進行相應(yīng)的轉(zhuǎn)換和存取。
但是這個有缺點,就是需要對User ID進行判斷,如果業(yè)務(wù)不一致,或者其他類型的應(yīng)用,可能不是那么合適,那么可以根據(jù)自己的實際業(yè)務(wù)來進行考慮,或者去想更合適的方法。
[ 減少數(shù)據(jù)庫壓力]
這個算是比較重要的,所有的數(shù)據(jù)基本上都是保存在數(shù)據(jù)庫當中的,每次頻繁的存取數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫性能急劇下降,無法同時服務(wù)更多的用戶,比如MySQL,特別頻繁的鎖表,那么讓Memcache來分擔數(shù)據(jù)庫的壓力吧。我們需要一種改動比較小,并且能夠不會大規(guī)模改變前端的方式來進行改變目前的架構(gòu)。
一個用PHP編寫的可視化的MemCached管理系統(tǒng)
MemAdmin是一款可視化的Memcached管理與監(jiān)控工具,使用PHP開發(fā),體積小,操作簡單。
主要功能:
服務(wù)器參數(shù)監(jiān)控:STATS、SETTINGS、ITEMS、SLABS、SIZES實時刷新;
服務(wù)器性能監(jiān)控:GET、DELETE、INCR、DECR、CAS等常用操作命中率實時監(jiān)控;
支持數(shù)據(jù)遍歷,方便對存儲內(nèi)容進行監(jiān)視;
支持條件查詢,篩選出滿足條件的KEY或VALUE;
數(shù)組、JSON等序列化字符反序列顯示;
兼容memcache協(xié)議的其他服務(wù),如Tokyo Tyrant (遍歷功能除外);
支持服務(wù)器連接池,多服務(wù)器管理切換方便簡潔。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的MemCache 分布式缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode: Roman to I
- 下一篇: 现在出纳记账手写还是用计算机,出纳现金日