Memcache知識點梳理

Memcached概念:
    Memcached是一個免費開源的,高性能的,具備分佈式對象的緩存系統,它能夠用來保存一些常常存取的對象或數據,保存的數據像一張巨大的HASH表,該表以Key-value對的方式存在內存中。
官網下載地址: http://www.memcached.org/
運行環境: linux,BSD,windows均可跑
協議理論:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt (英文)php

操做流程
linux

一、檢查客戶端的請求數據是否在memcached中,若有,直接把請求數據返回,再也不對數據庫進行任何操做,路徑操做爲①②③⑦。
二、若是請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,須要程序明確實現),路徑操做爲①②④⑤⑦⑥。
三、每次更新數據庫的同時更新memcached中的數據,保證一致性。
四、當分配給memcached內存空間用完以後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,而後再替換掉最近未使用的數據。ios

Memcached特徵:
協議簡單
   它是基於文本行的協議,直接經過telnet在memcached服務器上可進行存取數據操做
基於libevent事件處理
    Libevent是一套利用C開發的程序庫,它將BSD系統的kqueue,Linux系統的epoll等事件處理功能封裝成一個接口,與傳統的select相比,提升了性能。
內置的內存管理方式
    全部數據都保存在內存中,存取數據比硬盤快,當內存滿後,經過LRU算法自動刪除不使用的緩存,但沒有考慮數據的容災問題,重啓服務,全部數據會丟失。
分佈式
   各個memcached服務器之間互不通訊,各自獨立存取數據,不共享任何信息。服務器並不具備分佈式功能,分佈式部署取決於memcache客戶端。web

Memcached安裝與啓動:
安裝memcached須要先安裝libeventredis

Shell>tar zxvf libevent-1.4.14b-stable.tar.gz Shell>cd libevent-1.4.14b-stable Shell>./configure Shell>make && make install


安裝memcached算法

Shell>tar zxvf memcached-1.2.5.tar.tar Shell>cd memcached-1.2.5 Shell>./configure –prefix=/usr/local/memcached Shell>make && make install

啓動memcached
Shell>/usr/local/memcached/bin/memcached –p 11211 –d –u root –P /tmp/memcached.pidshell

-P是表示使用TCP,默認端口爲11211 -d表示後臺啓動一個守護進程(daemon) -u表示指定root用戶啓動,默認不能用root用戶啓動 -P表示進程的pid存放地點,此處「p」爲大寫「P」 -l,後面跟IP地址,手工指定監聽IP地址,默認全部IP都在監聽 -m後面跟分配內存大小,以MB爲單位,默認爲64M -c最大運行併發鏈接數,默認爲1024 -f 塊大小增加因子,默認是1.25 -M 內存耗盡時返回錯誤,而不是刪除項,即不用LRU算法

    在64位系統中,會報libevent-1.4.so.2文件沒法找到,解決辦法是把32位目錄裏的同名文件連接至64位目錄中,即像windows那樣創建快捷方式。
Shell > /usr/local/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2
啓動後若是發現沒有端口在監聽,是由於命動命令時帶pid參數的「p」是大寫「P」,你可能寫成小寫了。數據庫

命令行直接操做命令

存,有六個命令項。
windows

Set:添加一個新條目到memcached或是用新的數據替換替換掉已存在的條目 Add:當KEY不存在的狀況下,它向memcached存數據,不然,返回NOT_STORED響應 Replace:當KEY存在的狀況下,它纔會向memcached存數據,不然返回NOT_STORED響應 Cas:改變一個存在的KEY值 ,但它還帶了檢查的功能 Append:在這個值後面插入新值 Prepend:在這個值前面插入新值



取,有兩個命令項:
緩存

Get:取單個值 ,從緩存中返回數據時,將在第一行獲得KEY的名字,flag的值和返回的value長度,真正的數據在第二行,最後返回END,如KEY不存在,第一行就直接返回END Get_multi:一次性取多個值



刪除,一個命令:

Delete

實例操做:
先鏈接到memcache
 

shell>telnet 127.0.0.1 11211


在入數據

Set liuguohua 0 0 21 369369.blog.51cto.com


回車後系統自動保存,並返回正常值STORED
存入命令格式爲
<command> <key> <flags> <exptime> <bytes> \r\n
注意在設定bytes字節後,存入的值的長度必定要與之匹配,不然沒法保存成功,像liuguohua字段爲21字節,因此存入的369369.blog.51cto.com長度爲21(總計爲21個數字或字母)。

取數據

Get liuguohua


回車後,第一行返回VALUE liuguohua 0 21
第二行,返回真正值369369.blog.51cto.com

Memcached的內存算法:
    Memcached利用slab allocation機制來分配和管理內存,它按照預先規定的大小,將分配的內存分割成特定長度的內存塊,再把尺寸相同的內存塊分紅組,數據在存放時,根據鍵值 大小去匹配slab大小,找就近的slab存放,因此存在空間浪費現象。
    傳統的內存管理方式是,使用完經過malloc分配的內存後經過free來回收內存,這種方式容易產生內存碎片並下降操做系統對內存的管理效率。

Memcached的緩存策略:
    Memcached的緩存策略是LRU(最近最少使用)加上到期失效策略。當你在memcached內存儲數據項時,你有可能會指定它在緩存的失效時間,默認爲永久。當memcached服務器用完分配的內時,失效的數據被首先替換,而後也是最近未使用的數據。在LRU中,memcached使用的是一種Lazy Expiration策略,本身不會監控存入的key/vlue對是否過時,而是在獲取key值時查看記錄的時間戳,檢查key/value對空間是否過時,這樣可減輕服務器的負載。

Memcached的分佈式算法:
    當向memcached集羣存入/取出key/value時,memcached客戶端程序根據必定的算法計算存入哪臺服務器,而後再把key/value值存到此服務器中。也就是說,存取數據分二步走,第一步,選擇服務器,第二步存取數據。

分佈式算法(Consistent Hashing):

    選擇服務器算法有兩種,一種是根據餘數來計算分佈,另外一種是根據散列算法來計算分佈。
餘數算法:
    先求得鍵的整數散列值,再除以服務器臺數,根據餘數肯定存取服務器,這種方法計算簡單,高效,但在memcached服務器增長或減小時,幾乎全部的緩存都會失效。
散列算法:
    先算出memcached服務器的散列值,並將其分佈到0到2的32次方的圓上,而後用一樣的方法算出存儲數據的鍵的散列值並映射至圓上,最後從數據映射到的位置開始順時針查找,將數據保存到查找到的第一個服務器上,若是超過2的32次方,依然找不到服務器,就將數據保存到第一臺memcached服務器上。若是添加了一臺memcached服務器,只在圓上增長服務器的逆時針方向的第一臺服務器上的鍵會受到影響。

Memcache的管理與性能監控
能夠經過命令行直接管理與監控也可經過nagios,cacti等web軟件進行監控
命令行:

 
 
  1. Shell>telnet 127.0.0.1 1211 //若是在啓動時指定了IP及端口號,這裏要做相應改動
    鏈接成功後命令 

  2. Stats:統計memcached的各類信息 

  3. Stats reset:從新統計數據 

  4. Stats slabs,顯示slabs信息,能夠詳細看到數據的分段存儲狀況 

  5. Stats items:顯示slab中的item數目 

  6. Stats cachedump 1 0:列出slabs第一段裏存的KEY值 

  7. Set|get:保存或獲取數據 

  8. STAT evictions 0:表示要騰出新空間給新的item而移動的合法item數目 

其它經常使用軟件使用:

Shell>./Memcached-tool 127.0.0.1:11211 Shell>./Memcached-tool 127.0.0.1:11211 display

Web軟件:

Memcache.php Nagios插件 Cacti模塊



Memcached與redis比較: