memcached緩存知識簡單梳理

 

memcached工做原理
基本概念:slab,page,chunk。
slab,是一個邏輯概念。它是在啓動memcached實例的時候預處理好的,每一個slab對應一個chunk size,也就是說不一樣slab有不一樣的chunk size。具體分配多少個slab由參數 -f (增加因子)和 -n (chunk最小尺寸)決定的。
page,能夠理解爲內存頁。大小固定爲1m。slab會在存儲請求時向系統申請page,並將page按chunk size進行切割。
chunk,是保存用戶數據的最小單位。用戶數據item(包括key,value)最終會保存到chunk內。chunk規格是固定的,若是用戶數據放進來後還有剩餘則這剩餘部分不能作其餘用途。php

memcached工做流程
memcahed實例啓動,根據 -f 和 -n 進行預分配slab。以 -n 爲最小值開始,以 -f 爲比值生成等比數列,直到1m爲止(每一個slab的chunk size都要按8的倍數進行補全,好比:若是按比值算是556的話,會再加4到560成爲8的整倍數)。而後每一個slab分配一個page。當用戶發來存儲請求時(key,value),memcached會計算key+value的大小,看看屬於哪一個slab。肯定slab後看裏面的是否有空閒chunk放key+value,若是不夠就再向系統申請一個page(若是此時已經達到 -m 參數設置的內存使用上限,則看是否設置了 -M 。若是設置了 -M 則返回錯誤提示,不然按LRU算法刪除數據)。申請後將該page按本slab的chunk size 進行切割,而後分配一個來存放用戶數據。
注意:
1)chunk是在page裏面劃分的,而page固定爲1m,因此chunk最大不能超過1m。
2)chunk實際佔用內存要加48B,由於chunk數據結構自己須要佔用48B。
3)若是用戶數據大於1m,則memcached會將其切割,放到多個chunk內。
4)已分配出去的page不能回收。算法

優化建議
1)-n 參數的設置,注意將此參數設置爲1024能夠整除的數(還要考慮48B的差值),不然餘下來的部分就浪費了。
2)不要存儲超過1m的數據。由於要拆成多個chunk,計算和時間成本都成倍增長。
3)善用stats命令查看memcached狀態。
4)消滅eviction(被刪除的數據)。
形成eviction是由於內存不夠,有三個思路:
(1)在CPU有餘力的狀況下開啓壓縮(PHP擴展);
(2)增長內存;
(3)調整-f參數,減小內存浪費。
5)調整業務代碼,提升命中率。
6)緩存小數據。省帶寬,省網絡I/O時間,省內存。
7)根據業務特色,爲數據尺寸區間小的業務分配專用的memcached實例。這樣能夠調小 -f 參數,使數據集中存在少數幾個slab上,內存浪費較少。
啓動時最重要的參數:
-m 整個memcached最大內存
-f chunk大小增加因子
-n chunk最小分配空間
-C 禁用CAS
-vvv 打印詳細信息
咱們經過計算能夠看出,每一個slab的chunk size大小都是上一個大小的1.25倍,1.25就是memcached啓動時制定的-f的值,因此,要根據不一樣的業務場景調整,既要儘量少的減小內存浪費,又要存得下咱們業務中的數據,再舉個例子,加入咱們的業務很BT,大小都是200kb,咱們該怎麼作?那固然是要保證咱們申請的chunk大小都是200kb了,雖然memcached並不支持這麼作。假如建立了38個slabs,最後數據全都落到了第20-25個slab中,那0-19和26-38的內存就被浪費了,這只是能評估出來的,還有一種狀況,加入咱們的chunk大小是500kb,數據才200kb,由於每一個chunk都只能存儲一個,因此一個chunk就會有500kb-200kb的空間浪費,若是有一千萬個chunk要存,那將會浪費多少空間?因此,在使用memcached以前,先要評估你的數據,根據它去調整-f因子。緩存

memcached參數使用介紹(Win7用戶要以管理員身份啓動命令窗口哦!)
-p 監聽的端口 
-l 鏈接的IP地址, 默認是本機 
-d start 啓動memcached服務 
-d restart 重起memcached服務 
-d stop|shutdown 關閉正在運行的memcached服務 
-d install 安裝memcached服務 
-d uninstall 卸載memcached服務 
-u 以的身份運行 (僅在以root運行的時候有效)  
-m 最大內存使用,單位MB。默認64MB 
-M 內存耗盡時返回錯誤,而不是刪除項 
-c 最大同時鏈接數,默認是1024 
-f 塊大小增加因子,默認是1.25 
-n 最小分配空間,key+value+flags默認是48 
-h 顯示幫助

清空memcache緩存的方法
默認memcache會監聽11221端口,若是想清空服務器上memecache的緩存:
1)第一種方法:
# telnet localhost 11221
進入後,執行flush_allphp框架

2)第二種方法:
# echo "flush_all"|nc localhost 11221安全

------------------------php的memcache和memcached擴展區別------------------------
memcache文檔:http://pecl.php.net/package/memcache
memcached文檔:http://pecl.php.net/package/memcachedbash

1)首先看下開發時間:
memcache最先是在2004年2月開發的,最後更新是在2013年4月;
memcached最先是在2009年1月開發的,最後更新是在2014年1月更新的。
因此memcache的歷史比memcached早。服務器

2)memcache是一個原生版本,徹底在php框架內開發的。與之對應的帶d的memcached是創建在libmemcached的基礎上,因此相對來講,memcached版本的功能更全一些。
在安裝memcache擴展的時候並不要求安裝其餘東西,可是在安裝memcached的時候會要求安裝libmemcached;
libmemcached是memcache的C客戶端,它具備的優勢是低內存,線程安全等特色。
好比新浪微博以前就全面將php的memcache替換成php的memcached,在高併發下,穩定性果斷提升。網絡

3)memcache的方法特別少,好比getMulti,setMulti都是沒有的,基本就剩下最簡單的get和set了。
因此說memcached比memcache支持更多的memcache協議。session

memcache方法列表:http://cn2.php.net/memcache
memcached方法列表:http://www.php.net/manual/zh/book.memcached.php數據結構

4)Memcache是原生實現的,支持OO和非OO兩套接口並存。而memcached是使用libmemcached,只支持OO接口。

5)memcached直接配置了session支持,只要稍微修改下配置文件就能夠把session存儲在memcache中了。

6)memcached還有個很是稱讚的地方,就是flag不是在操做的時候設置了,而是有了一個統一的setOption()。Memcached實現了更多的memcached協議。

7)memcached支持Binary Protocol,而memcache不支持。這意味着memcached會有更高的性能。不過memcached目前還不支持長鏈接。

----------------------------------------------------------------------------
鏈接到memcache後,使用stats命令查看緩存狀態

[root@bastion-IDC ~]# telnet 192.168.1.5 11211
Trying 192.168.1.5...
Connected to 192.168.1.5.
Escape character is '^]'.
stats
STAT pid 20439  ----> Memcached 進程的ID
STAT uptime 179982 ----> 進程運行時間
STAT time 1382361665 ---->當前時間
STAT version 1.4.15 ----> Memcached 版本
STAT libevent 1.4.13-stable
STAT pointer_size 32
STAT rusage_user 21.916668
STAT rusage_system 40.576831
STAT curr_connections 11
STAT total_connections 329
STAT connection_structures 23
STAT reserved_fds 20
STAT cmd_get 2363348 ----> 總共獲取數據的次數(等於 get_hits + get_misses )
STAT cmd_set 279971 ----> 總共設置數據的次數
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 2286284 ----> 命中了多少次數據,也就是從 Memcached 緩存中成功獲取數據的次數
STAT get_misses 77064 ----> 沒有命中的次數
STAT delete_misses 30803
STAT delete_hits 48876
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 574591015
STAT bytes_written 4353057466
STAT limit_maxbytes 67108864 ----> 總的存儲大小,默認爲 64M
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 262144
STAT hash_is_expanding 0
STAT bytes 4717345 ----> 當前所用存儲大小
STAT curr_items 5654
STAT total_items 58461
STAT expired_unfetched 17
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 49

以上數據的命中率:2286284/2363348 = 96.7% 說明當前命中率是比較高的。

相關文章
相關標籤/搜索