memcached是一個免費開源的,高效能的,具有分散式物件的快取系統,它可以用來儲存一些經常存取的物件或者資料,儲存的資料像一張巨大的hash表,該表示已key-value對的方式儲存在記憶體中。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
為什麼會有memcache和memcached兩種名稱呢?
memcache是這個專案的名稱,而memcached是它伺服器端的主程式的檔名。
memcached特徵:
- 協議簡單
它是基於文字行的協議,直接通過telnet在memcached伺服器上可以進行存取資料的操作 - 基於libevent事件處理
libevent是一套利用c開發的程式庫,它將BSD系統的kqueue,linux系統的epoll等事件處理功能封裝成一個介面,與傳統的select,提高了效能 - 內建的記憶體管理方式
所有的資料都是儲存在記憶體中的,所以存取資料要比硬碟要快,當記憶體滿了之後,會通過LRU演算法自動刪除不使用的快取,但是沒有考慮資料的容災問題,重啟問題,所有的資料會丟失 - 分散式
各個memcached伺服器之間乎不同心,各自獨立存取資料,不共享任何資訊。伺服器並不具有分散式功能,分散式部署取決於memcached客戶端
memcache的安裝
分為兩個過程:
- memcache伺服器端的安裝
就是在伺服器(一般都是linux系統)上安裝memcached實現資料的儲存 - memcached客戶端的安裝
在程式中去使用伺服器端的memcache提供的函式
Memcache的工作流程:
先檢查客戶端的請求出具是否在memcached中,如果存在,則直接將資料返回,不再對資料庫進行任何操作;如果請求的資料不再memcached中,就會先去查詢資料庫,把從資料庫中獲取的資料返回給客戶端,同時把資料快取一份到memcached中(這個過程需要服務端程式去實現);每次更新資料庫的同時 更新memcached中的資料,保證一致性;當分配給memcached記憶體空間用完之後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效資料首先被替換,然後再替換掉最近未使用的資料。
memcached的記憶體演算法:
memcached利用slab allocation機制來分配和管理記憶體,它按照預先規定的大小,將分配的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,資料在存放時,根據鍵值大小去批判匹配slab大小,找就近的slab存放,所以存在空間浪費現象。
傳統的記憶體管理方式:使用完通過maclloc分配的記憶體後通過free來回收記憶體,這種方式容易產生記憶體碎片,並降低作業系統對記憶體的管理效率。
memcached的快取策略:
memcached的快取策略是LRU(最近最少使用)加上到期失效策略。當你在memcached記憶體儲存資料是,有可能會指定它在快取的失效時間,預設為永久。當memcached伺服器用完分配的記憶體是,失效的資料的資料首先被替換,然後是最近未使用的資料。在LRU中,memcached使用的是一種Lazy Expiration策略,自己不會監控存入的key/value對是否過期,而是在獲取key值時檢視記錄的時間戳,檢查key/value對空間是否過期,這樣可減輕伺服器的負載。
分散式演算法:
- 餘數演算法
先球的鍵的整數雜湊值,再除以伺服器臺數,根據餘數確定存取伺服器,這種方法計算簡單,高效,但在memcached伺服器動態增減的時候,幾乎所有的快取都會失效 - 雜湊演算法
先算出memcached伺服器的雜湊值,並將其分佈到0到2的32次方的圓上,最後從資料對映到的位置開始順時針查詢,將資料儲存到查詢到的第一臺伺服器上,如果超過2的32次方,還是找不到伺服器,就將資料儲存到第一臺memcached伺服器上,如果新增一臺memcached伺服器,只在圓上增加伺服器的逆時針方向的第一臺伺服器上的鍵會受到影響。
memcached安裝
先安裝libevent
# 下載libevent安裝包
wget http://jaist.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
# 解壓
tar zxvf libevent-2.0.22-stable.tar.gz -C /usr/local/
# 進入到解壓目錄
cd /usr/local/libevent-2.0.22-stable
# 配置編譯、安裝
./configure -prefix=/usr/libevent
make
make install
安裝memcached
# 下載memcached的安裝包
wget http://memcached.org/files/memcached-1.4.24.tar.gz
# 解壓安裝包到指定的目錄
tar zxvf memcached-1.4.24.tar.gz -C /usr/local/
# 進入解壓後的目錄
cd /usr/local/memcached-1.4.24
# 配置、編譯、安裝,注:configure時需要指定libevent的安裝路徑
./configure -with-libevent=/usr/libevent/ -prefix=/usr/local/memcached
make
make install
安裝完成後,啟動memcached
/usr/local/bin/memcached -d -m 10 -u root -l 192.168.100.126 -p 12000 -c 256 -P /tmp/memcached.pid
ps -ef|grep memcached # 檢視memcached程式
killcat /tmp/memcached.pid
# 結束memcached程式
啟動引數介紹如下:
- -d 選項是啟動一個守護程式,
- -m 是分配給Memcache使用的記憶體數量,單位是MB,這裡是10MB,
- -u 是執行Memcache的使用者,這裡是root,
- -l 是監聽的伺服器IP地址,如果有多個地址的話,這裡指定了伺服器的IP地址192.168.0.200,
- -p 是設定Memcache監聽的埠,這裡設定了12000,最好是1024以上的埠,
- -c 選項是最大執行的併發連線數,預設是1024,這裡設定了256,按照伺服器的負載量來設定,
- -P 是設定儲存Memcache的pid檔案,我這裡是儲存在 /tmp/memcached.pid,也可以啟動多個守護程式,不過埠不能重複。
測試memcached
[root@localhost memcached]# telnet 192.168.100.126 11211
Trying 192.168.100.126...
Connected to 192.168.100.126.
Escape character is '^]'.
set key1 0 60 4
test
STORED
get key1
VALUE key1 0 4
test
END
quit
Connection closed by foreign host.
memcached安裝完成!