memcache是一個免費開源的、高性能的、具備分佈式內存對象的緩存系統,經過減輕數據庫負載加速動態web應用,提升訪問網站的相應速度。memcache將常常存取的數據以key-value的方式緩存在內存中。web
memcache和數據庫的協做過程:算法
一、客戶端發送請求到memcache服務器上,memcache檢查請求的數據是否存在memcache上,若是存在,直接將數據返回給客戶端
數據庫
二、若是數據不在memcache上,memcache會去查詢數據庫,數據庫會將數據返回給客戶端,同時將數據緩存一份到memcache上
緩存
三、每次數據庫數據更新時會同時更新memcache中的數據,保持數據一致
bash
四、當memcache的內存空間用完時,會使用LRU算法,替換掉最近最少使用的key/value。
服務器
memcache的工做過程架構
memcache是採用C/S架構,服務端啓動服務守護進程,監聽在指定的IP和端口上,一直處於等待客戶端鏈接的狀態。多個服務端能夠協同工做,但各個服務器之間不通訊,也不共享任何信息,經過對客戶端的設計,讓memcache能支持大規模緩存。併發
數據是以key/value的方式保存在memcache的內存中,因此存取速度快,但在服務器重啓後內存中的數據就會消失。tcp
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服務器時,客戶端上有服務器列表信息,當客戶端要存入數據時,客戶端先根據必定的分佈式算法肯定要將數據存入哪一個服務器上。當獲取數據時,客戶端根據相同的算法肯定數據所在的服務器,再到該服務器上獲取數據。
優勢:將不一樣數據分散保存在不一樣的服務器上,當一臺服務器發生故障時,只是這臺服務器上的數據沒法訪問,其餘服務器上的數據不受影響
客戶端上常見的分佈式算法
一、餘數分佈算法:先求得鍵的整數散列值,而後除以服務器臺數,根據餘數肯定數據存放在哪臺服務器上。
優勢:計算簡單,效率高
缺點:當服務器增長或減小時,會致使全部緩存失效
二、一致性散列算法:先算出memcache服務器節點的散列值,並將其分配到0到2^32的圓上,而後算出數據的鍵的散列值並映射到圓上,從數據映射的位置開始順時針查找,將數據保存在查找到的第一個服務器上。
優勢:當服務器數量發生變化時,影響範圍較小,能夠最大限度地減小緩存的失效量。
memcache安裝注意:
一、要先安裝libevent
二、將/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鏈接測試