memcache原理

memcache是一個免費開源的、高性能的、具有分佈式內存對象的緩存系統,通過減輕數據庫負載加速動態web應用,提高訪問網站的相應速度。memcache將經常存取的數據以key-value的方式緩存在內存中。

memcache和數據庫的協作過程:

    1、客戶端發送請求到memcache服務器上,memcache檢查請求的數據是否存在memcache上,如果存在,直接將數據返回給客戶端

    2、如果數據不在memcache上,memcache會去查詢數據庫,數據庫會將數據返回給客戶端,同時將數據緩存一份到memcache上

    3、每次數據庫數據更新時會同時更新memcache中的數據,保持數據一致

    4、當memcache的內存空間用完時,會使用LRU算法,替換掉最近最少使用的key/value。

memcache的工作過程

memcache是採用C/S架構,服務端啓動服務守護進程,監聽在指定的IP和端口上,一直處於等待客戶端連接的狀態。多個服務端可以協同工作,但各個服務器之間不通信,也不共享任何信息,通過對客戶端的設計,讓memcache能支持大規模緩存。

數據是以key/value的方式保存在memcache的內存中,所以存取速度快,但在服務器重啓後內存中的數據就會消失。

memcache的內存分配和管理

memcache使用slab allocation機制來分配和管理內存。按照預先規定的大小,將分配給memcache的內存分割成不同長度的內存塊組,其中長度相同的爲一組,這些內存塊不會被釋放。

  優點:可以重複利用

  缺點:可能會造成內存浪費,如將一個100字節的數據存入一個200字節長度的內存塊時,會有100字節內存被浪費掉

  解決辦法:在啓動memcache時指定“-f”選項,控制不同內存塊組之間的長度梯度,默認爲1.25。

memcache的刪除機制

在向memcache中存數據時,可以指定數據的過期時間,當數據過期時,客戶端不能通過key取出它的值,其存儲空間將被重新使用。但memcache不會監控存入的數據是否過期,而是在獲取key值時檢查其是否過期,採用這樣的策略不會在過期檢測上浪費cpu資源。

memcache在分配空間時,會優先使用已經過期的key/value空間,但內存空間被佔滿時,memcache會使用LRU算法來分配空間,刪除最近最少使用的數據,將空間分配給新的數據。如果不想使用LRU算法,可以在啓動memcache時使用‘-M’參數,這樣當內存耗盡時,會返回一個報錯信息。

多memcache服務器協同工作

有多個memcache服務器時,客戶端上有服務器列表信息,當客戶端要存入數據時,客戶端先根據一定的分佈式算法確定要將數據存入哪個服務器上。當獲取數據時,客戶端根據相同的算法確定數據所在的服務器,再到該服務器上獲取數據。

優點:將不同數據分散保存在不同的服務器上,當一臺服務器發生故障時,只是這臺服務器上的數據無法訪問,其他服務器上的數據不受影響

客戶端上常見的分佈式算法

    1、餘數分佈算法:先求得鍵的整數散列值,然後除以服務器臺數,根據餘數確定數據存放在哪臺服務器上。

    優點:計算簡單,效率高

    缺點:當服務器增加或減少時,會導致所有緩存失效

    2、一致性散列算法:先算出memcache服務器節點的散列值,並將其分配到0到2^32的圓上,然後算出數據的鍵的散列值並映射到圓上,從數據映射的位置開始順時針查找,將數據保存在查找到的第一個服務器上。

    優點:當服務器數量發生變化時,影響範圍較小,可以最大限度地減少緩存的失效量。

memcache安裝注意

    1、要先安裝libevent

    2、將/usr/local/lib加入到/etc/ld.so.conf中

[root@lzs ~]#echo "/usr/local/lib" >> /etc/ld.so.conf
[root@lzs ~]#ldconfig

啓動memcache

/usr/local/bin/memcached -m 20m -p 11211 -d -u root -P /var/run/memcached.pid -c 1024
-m指定分配給memcache的內存大小
-p指定memcache監聽的tcp端口(默認11211)
-d作爲守護進程在後臺運行
-u指定運行memcache的用戶
-P指定pid文件
-c

指定memcache最大併發連接的數量(默認1024)

啓動後可以使用telnet連接測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章