日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MemCache 分布式缓存

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MemCache 分布式缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引用: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。