Memcached學習筆記

目錄php


前言

  • 此爲學習筆記彙總,若有紕漏之處,還望不吝指出,謝謝。

啓動流程

  • 調用settings_init()設定初始化參數
  • 從啓動命令中讀取參數來設置setting值
  • 設定LIMIT參數
  • 開始網絡Socket監聽,也支持UDP
  • 檢查用戶身份,不容許以root運行
  • 若是有socketpath存在,開啓UNIX本地鏈接,是Sock管道
  • 若是以-d方式啓動,調用daemon(), 建立守護進程
  • 初始化item,event,狀態信息,hash,鏈接,slab
  • 如設置中managed生效,建立bucket數組
  • 檢查是否須要鎖定內存頁
  • 初始化信號,鏈接,刪除隊列
  • 若是採用daemon方式,處理進程ID
  • event開始,啓動過程結束,main函數進入循環

內存分配

分配模型
  • MemCache存放的value大小是限制的,由於一個新數據過來,slab會先以page爲單位申請一塊內存,申請的內存最多就只有1M,因此value大小天然不能大於1M了
  • chunk分配待會內存浪費,但也避免了管理內存碎片的問題web

大小關係
  • MemCache將內存空間分爲一組slab
  • 每一個slab下又有若干個page,每一個page默認是1M
  • 每一個page裏面包含一組chunk,chunk是真正存放數據的地方,同一個slab裏面的chunk的大小是固定的
  • 有相同大小chunk的slab被組織在一塊兒,稱爲slab_class
  • 鄰slab內的chunk基本以1.25爲比例進行增加,MemCache啓動時能夠用-f指定這個比例

回收機制

LRU
  • 精髓:Memcached會把剛剛訪問過的item放到item列表頭部,尾部的是沒有/不多被訪問的
  • 若是MemCache啓動沒有追加-M(禁止LRU,這種狀況下內存不夠會報Out Of Memory錯誤),可使用
  • MemCache的LRU算法不是針對全局的,是針對slab的
步驟
  • 使用slabs_alloc函數申請內存失敗,就開始淘汰數據
  • 從item list尾部開始遍歷,在列表中查找一個refcount爲0的item,釋放
  • 若是找不到,查找一個3小時內沒有訪問過的item
  • 若是尚未,返回NULL,申請內存失敗
懶惰刪除
  • memcached不會釋放已分配的內存,記錄超時後,客戶端就沒法再看見該記錄(invisible,透明), 其存儲空間便可重複使用
  • memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。 這種技術被稱爲lazy(惰性)expiration
  • 所以,memcached不會在過時監視上耗費CPU時間

特性和限制

  • MemCache中能夠保存的item數據量是沒有限制的,只要內存足夠
  • MemCache單進程在32位機中最大使用內存爲2G,這個以前的文章提了屢次了,64位機則沒有限制
  • Key最大爲250個字節,超過該長度沒法存儲
  • 單個item最大數據是1MB,超過1MB的數據不予存儲
  • MemCache服務端是不安全的,好比已知某個MemCache節點,能夠直接telnet過去,並經過flush_all讓已經存在的鍵值對當即失效
  • 不可以遍歷MemCache中全部的item,由於這個操做的速度相對緩慢且會阻塞其餘的操做
  • MemCache的高性能源自於兩階段哈希結構:第一階段在客戶端,經過Hash算法根據Key值算出一個節點;第二階段在服務端,經過一個內部的Hash算法,查找真正的item並返回給客戶端。從實現的角度看,MemCache是一個非阻塞的、基於事件的服務器程序
  • MemCache設置添加某一個Key值的時候,傳入expiry爲0表示這個Key值永久有效,這個Key值也會在30天以後失效,寫在了源碼Memcached.c中,通常不修改

Memcache::add

  • bool Memcache :: add ( string $key , mixed $var [ , int $flag [ , int $expire ]] )
說明
  • 若是$key不存在的時候,使用這個函數來存儲$var的值
  • 功能相同的函數是memcache_add()
參數
  • $key :將要存儲的鍵值
  • $var :存儲的值,字符型和整型會按原值保存,其餘類型自動序列化之後保存
  • $flag:是否用 MEMCACHE_COMPRESSED 來壓縮存儲的值, true 表示壓縮, false 表示不壓縮
  • $expire:存儲值的過時時間,若是爲0表示不會過時,你能夠用unix時間戳或者描述來表示從如今開始的時間,可是你在使用秒數表示的時候,不要超過2592000秒 (表示30天)
返回值
  • 若是成功則返回 TRUE,失敗則返回 FALSE
  • 若是$key值已經存在,則會返回FALSE
  • 其餘狀況下Memcache::add()的用法相似於Memcache::set()

Memcache::addServer

  • bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )
說明
  • 添加一個可供使用的服務器地址到鏈接池中,鏈接用Memcache::addServer打開
  • 腳本執行完後自動關閉,或者能夠用Memcache::close()手動關閉
  • 相同函數是memcache_add_server()
  • 當用這個方法的時候(相對於Memcache::connect()和 Memcache::pconnect()方法),網絡鏈接只有等須要的時候纔會創建,所以不會由於增長不少的服務器到鏈接池而增長系統負擔,由於不少服務器可能沒有使用
故障恢復
  • 故障恢復會發生在這個方法執行的任何階段,只要其餘的服務器是正常的,這些鏈接請求的失敗用戶不會注意到
  • 任何一種socket或者memcached服務器級的錯誤能夠觸發故障恢復
  • 正常的客戶端錯誤好比增長一個存在的鍵值不會引起故障恢復
參數
  • $host服務器的地址
  • $port服務器端口
  • $persistent是不是一個持久鏈接
  • $weight這臺服務器在全部服務器中所佔的權重
  • $timeout鏈接的持續時間
  • $retry_interval鏈接重試的間隔時間,默認爲15,設置爲-1表示不進行重試
  • $status控制服務器的在線狀態
  • $failure_callback容許設置一個回掉函數來處理錯誤信息

Memcache::close

  • bool Memcache :: close ( void )
說明
  • 關閉memcache服務器鏈接
  • 這個函數不會關閉長鏈接,長鏈接只有在web服務器關閉或者重啓的時候纔會關閉
  • 相同的函數memcache_close()

Memcache::connect

  • bool Memcache :: connect ( string $host [ , int $port [ , int $timeout ]] )
說明
  • 打開memcached服務器鏈接,創建一個到memcached服務器的鏈接,用Memcache::connect打開的鏈接會在腳本執行完畢後自動關閉
  • 你也能夠用Memcache::close()去關閉鏈接
  • 相同的函數是memcache_connect()
參數
  • $host:指向memcached正在收聽的連接的主機,這個參數會有另外一種特殊的鏈接方式unix:///path/to/memcached.sock,即用unix的域名sockets,這種狀況下,端口必須設置爲0
  • $port:指向memcached正在收聽的連接的端口,用unix的域名sockets的狀況下,端口必須設置爲0
  • $timeout:用於鏈接守護進程的秒數,當你改變默認的1秒的值的時候,你須要考慮一下,若是你的鏈接太慢的話,你可能會失去緩存的優點。

memcache::debug

  • bool memcache_debug ( bool $on_off )
說明
  • 控制調試功能,前提是php在編譯的時候使用了-enable-debug選項,不然這個函數不會有做用
參數
  • $on_off:true表示開啓調試,false表示關閉調試
返回值
  • 若是php在編譯的時候使用了-enable-debug選項,返回true,不然返回false

Memcache::decrement

  • int Memcache :: decrement ( string $key [ , int $value ] )
說明
  • Memcache::decremen方法的做用是對保存的某個key中的值進行減法操做,用法跟Memcache::increment相似
  • 也可用memcache_decrement()函數
參數
  • $Key:想要減小的鍵的名字
  • $Value:想要減小的值
返回值
  • 若是成功,返回被減小後的值,若是失敗返回false

Memcache::delete

  • bool Memcache :: delete ( string $key [ , int $timeout ] )
說明
  • 一個key值,若是參數$timeout被設置,那麼存儲的值會在設置的秒數之後過時,你也能夠用函數memcache_delete()

Memcache::flush

  • bool Memcache :: flush ( void )
說明
  • 清除全部緩存的數據。Memcache::flush實際上沒有釋放資源,它僅僅將全部的緩存標記爲過時,這樣可使新的緩存來覆蓋被佔的內存空間
  • 同樣的函數是memcache_flush()

Memcache::get

  • string Memcache :: get ( string $key [ , int & $flags ] )
  • array Memcache :: get ( array $keys [ , array & $flags ] )
說明
  • 方法的做用是獲取一個key值,key值能夠是一個數組,結果會包含鍵值對
參數
  • $key是鍵值或者一個鍵的數組值
  • $flags若是這個參數存在,那麼$flags跟寫入這個參數的值相關,這些$flags 相似於Memcache::set()函數裏的$flags
返回值
  • 若是成功,則返回key對應的值,若是失敗則返回false

Memcache::getExtendedStats

  • array Memcache :: getExtendedStats ([ string $type [ , int $slabid [ , int $limit ]]] )
說明
  • 獲取進程池中全部進程的運行系通通計
  • 相同函數是 memcache_get_extended_stats()
參數
  • $type表示要求返回的類型:reset, malloc, maps, cachedump, slabs, items, sizes
  • $slabid第一個參數設置爲」cachedump」時使用的
  • $limit第一個參數設置爲」cachedump」時使用的

Memcache::getServerStatus

  • int Memcache :: getServerStatus ( string $host [ , int $port ] )
說明
  • 獲取運行服務器的參數,返回一個服務器在線或者離線的狀態
  • 相同的函數是memcache_get_server_status()
參數
  • $host:正在收聽的鏈接的主機
  • $port正在收聽的鏈接的主機的端口,默認是11211
返回值
  • 成功返回服務器狀態,服務器沒有啓動會返回0,其餘數字的時候表示服務器是啓動狀態的算法

    Memcache::getStats

  • array Memcache :: getStats ([ string $type [ , int $slabid [ , int $limit ]]] )數組

說明
  • 返回服務器的一些運行統計信息
  • 相同的函數是memcache_get_stats()
參數
  • $type表示要求返回的類型:reset, malloc, maps, cachedump, slabs, items, sizes
  • $slabid第一個參數設置爲」cachedump」時使用的
  • $limit第一個參數設置爲」cachedump」時使用的

Memcache::getVersion

  • string Memcache :: getVersion ( void )
說明
  • 返回運行的Memcache的版本信息
  • 相同函數memcache_get_version()緩存

    Memcache::increment

  • int Memcache :: increment ( string $key [ , int $value ] )
  • 對保存的某個key中的值進行加法操做
  • 用法參考Memcache::decrement安全

Memcache::pconnect

  • bool Memcache :: pconnect ( string $host [ , int $port [ , int $timeout ]] )
說明
  • 建立一個Memcache的持久鏈接對象
  • 這個鏈接在腳本執行完或者Memcache::close()函數運行也不會被關閉
  • 與它相同的函數是memcache_pconnect()
參數
  • $host:指向memcached正在收聽的連接的主機,這個參數會有另外一種特殊的鏈接方式unix:///path/to/memcached.sock,即用unix的域名sockets,這種狀況下,端口必須設置爲0
  • $port:指向memcached正在收聽的連接的端口,用unix的域名sockets的狀況下,端口必須設置爲0
  • $timeout:用於鏈接守護進程的秒數,當你改變默認的1秒的值的時候,你須要考慮一下,若是你的鏈接太慢的話,你可能會失去緩存的優點

Memcache::replace

  • bool Memcache :: replace ( string $key , mixed $var [ , int $flag [ , int $expire ]] )
說明
  • 對一個已有的key進行覆寫操做
  • 相同函數是memcache_replace()
參數
  • $key :將要存儲的鍵值
  • $var :存儲的值,字符型和整型會按原值保存,其餘類型自動序列化之後保存
  • $flag:是否用 MEMCACHE_COMPRESSED 來壓縮存儲的值, true 表示壓縮, false 表示不壓縮
  • $expire:存儲值的過時時間,若是爲0表示不會過時,你能夠用unix時間戳或者描述來表示從如今開始的時間,可是你在使用秒數表示的時候,不要超過2592000秒 (表示30天)服務器

    Memcache::set

  • bool Memcache :: set ( string $key , mixed $var [ , int $flag [ , int $expire ]] )網絡

說明
  • 添加一個值,若是已經存在,則覆寫
  • 相同函數是memcache_set()
參數
  • $key :將要存儲的鍵值
  • $var :存儲的值,字符型和整型會按原值保存,其餘類型自動序列化之後保存
  • $flag:是否用 MEMCACHE_COMPRESSED 來壓縮存儲的值, true 表示壓縮, false 表示不壓縮
  • $expire:存儲值的過時時間,若是爲0表示不會過時,你能夠用unix時間戳或者描述來表示從如今開始的時間,可是你在使用秒數表示的時候,不要超過2592000秒 (表示30天)

Memcache::setCompressThreshold

  • bool Memcache :: setCompressThreshold ( int $threshold [ , float $min_savings ] )
說明
  • 對大於某一大小的數據進行壓縮
  • 相同的函數是memcache_set_compress_threshold()
參數
  • setCompressThreshold方法有兩個參數,第一個參數表示處理數據大小的臨界點,第二個參數表示壓縮的比例,默認爲0.2

Memcache::setServerParams

  • bool Memcache :: setServerParams ( string $host [ , int $port [ , int $timeout [ , int $retry_interval [ , bool $status [ , callback $failure_callback ]]]]] )
說明
  • 在運行時修改服務器的參數
  • 相同函數是memcache_set_server_params()
參數
  • $host服務器的地址
  • $port服務器端口
  • $timeout鏈接的持續時間
  • $retry_interval鏈接重試的間隔時間,默認爲15,設置爲-1表示不進行重試
  • $status控制服務器的在線狀態
  • $failure_callback容許設置一個回掉函數來處理錯誤信息

參考資料

  • 圖片來源於網絡
  • Memcached官網
  • Memcached徹底剖析
相關文章
相關標籤/搜索