memcache 基础原理
生活随笔
收集整理的這篇文章主要介紹了
memcache 基础原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
memcache是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提升網站的訪問速度,尤其對于一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著[1]??。這是一套開放源代碼軟件,以BSD license授權發布。
?
MemCache的工作流程如下:先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對數據庫進行任何操作;如果請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,需要程序明確實現);每次更新數據庫的同時更新memcached中的數據,保證一致性;當分配給memcached內存空間用完之后,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,然后再替換掉最近未使用的數據。[2]? 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 將斷開當前連接 我只是一條小魚,跟隨大魚們,!!!大神在哪啊!!
總結
以上是生活随笔為你收集整理的memcache 基础原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解Hadoop集群和网络
- 下一篇: memcached企业面试题