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連接測試