在搭建一套環境時偶然接觸到memcache這個東西,下面咱們就來談談什麼是memcache,何時使用memcache,怎麼安裝memcache!html
1.什麼是memcachenode
Memcache是danga.com的一個項目,最先是爲 LiveJournal 服務的,目前全世界很多人使用這個緩存項目來構建本身大負載的網站,來分擔數據庫的壓力。它能夠應對任意多個鏈接,使用非阻塞的網絡IO。因爲它的工做機制是在內存中開闢一塊空間,而後創建一個HashTable,Memcached自管理這些HashTable。
linux
2.爲何要使用memcachegit
因爲網站的高併發讀寫需求,傳統的關係型數據庫開始出現瓶頸,例如:
1)對數據庫的高併發讀寫:
關係型數據庫自己就是個龐然大物,處理過程很是耗時(如解析SQL語句,事務處理等)。若是對關係型數據庫進行高併發讀寫(每秒上萬次的訪問),那麼它是沒法承受的。
2)對海量數據的處理:
對於大型的SNS網站,天天有上千萬次的蘇劇產生(如twitter, 新浪微博)。對於關係型數據庫,若是在一個有上億條數據的數據表種查找某條記錄,效率將很是低。
使用memcache能很好的解決以上問題。
在實際使用中,一般把數據庫查詢的結果保存到Memcache中,下次訪問時直接從memcache中讀取,而再也不進行數據庫查詢操做,這樣就在很大程度上減小了數據庫的負擔。
保存在memcache中的對象實際放置在內存中,這也是memcache如此高效的緣由。數據庫
3.關於libevent的事件處理緩存
libevent是個程序庫,它將Linux的epoll、BSD類操做系統的kqueue等事件處理功能 封裝成統一的接口。即便對服務器的鏈接數增長,也能發揮O(1)的性能。
memcached使用這個libevent庫,所以能在Linux、BSD、Solaris等操做系統上發揮其高性能。
參考:
libevent:http://www.monkey.org/~provos/libevent/
The C10K Problem: http://www.kegel.com/c10k.html服務器
4.cache如何支持高併發(此處還需深刻研究)網絡
memcache使用多路複用I/O模型,如(epoll, select等),傳統I/O中,系統可能會由於某個用戶鏈接還沒作好I/O準備而一直等待,知道這個鏈接作好I/O準備。這時若是有其餘用戶鏈接到服務器,極可能會由於系統阻塞而得不到響應。多線程
而多路複用I/O是一種消息通知模式,用戶鏈接作好I/O準備後,系統會通知咱們這個鏈接能夠進行I/O操做,這樣就不會阻塞在某個用戶鏈接。所以,memcache才能支持高併發。併發
此外,memcache使用了多線程機制。能夠同時處理多個請求。線程數通常設置爲CPU核數,這研報告效率最高。
Memcached單進程最大使用內存爲2G,要使用更多內存,能夠分多個端口開啓多個Memcached進程
5.memcache的安裝詳解
注意:安裝路徑根據實際狀況修改
準備安裝文件
下載memcached與libevent的安裝文件(文件夾內已經下載好了memcached和libevent)
注意,linux通常都帶有libevent,若是版本過老則考慮更新版本,若是版本不老那麼不必安裝libevent了
安裝libevent(可選)
因爲memcached依賴於libevent,所以須要安裝libevent。因爲linux系統可能默認已經安裝libevent,執行命令:
rpm -qa|grep libevent 查看當前系統中libevent安裝的版本
查看系統是否帶有該安裝軟件,若是有且版本比較老,則執行命令:
rpm -e libevent-1.4.13-4.el6.x86_64 --nodeps(因爲系統自帶的版本舊,忽略依賴刪除)
安裝libevent命令:
tar zxvflibevent-2.0.22-stable.tar.gz
cdlibevent-2.0.22-stable
./configure--prefix=/usr/local/libevent
make
makeinstall
至此libevent安裝完畢;
安裝memcache
tar xvfmemcached-1.4.24.tar.gz (這個包有點問題,因此不加z)
cdmemcached-memcached-1.4.24
./configure--prefix=/usr/local/memcached --with-libevent=
/usr/local/libevent/
make
makeinstall
至此memcached安裝完畢;
可能存在的錯誤以及解決方案
① 若是出現客戶端鏈接不上memcached的狀況,請將防火牆關閉或將防火牆中的memcached端口(11211端口)打開。
② 在make&& make install時,報錯,make: *** No targets specified and no makefile found. Stop.
從新./configure --prefix=/usr/local/memcached會發現checkingfor libevent directory... configure: error: libevent is required.
查看系統安裝的libevent
# rpm -qa | grep libevent
已經安裝,而後升級
#yum -y install libevent
測試libevent是否是已經安裝成功
# ls -al /usr/lib | grep libevent
能夠看到多個已經安裝的類包,而後再安裝memcached,編譯依舊通不過,
③ 安裝時報:checkingfor libevent directory... configure: error: libevent is required. You can getit from http://www.monkey.org/~provos/libevent/
If it's alreadyinstalled, specify its path using --with-libevent=/dir/
由於libevent這個包是系統默認安裝的,沒有安裝相應的開發所用的頭文件。
因此,還要使用以下命令來安裝:
yum install libevent-devel
而後再從新安裝下memcached就OK了
將memcached加入啓動項
# vi /etc/rc.local
在最後加入/usr/local/memcached/bin/memcached -d -m 128 -l 127.0.0.1-p 11211 -u root
啓動memcached
打開一個終端,輸入如下命令:
/usr/local/memcached/bin/memcached -d -m 128 -u root -p11211 -c 1024 –P /tmp/memcached.pid
中止memcached
打開一個終端,輸入如下命令:
ps -ef | grep memcached或者上面的ps命令也行,第二個字段爲PID,好比10068
輸入一下命令終止memcached服務
kill -9 10068
附:
啓動參數說明:
-d 選項是啓動一個守護進程。
-u root 表示啓動memcached的用戶爲root。
-m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。
-M return error on memory exhausted (rather than removingitems)。
-u 是運行Memcache的用戶,若是當前爲root 的話,須要使用此參數指定用戶。
-p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。
-c 選項是最大運行的併發鏈接數,默認是1024。
-P 是設置保存Memcache的pid文件。
另外還有個更詳細的參數說明:
memcached 1.4.2
-p <num> 監聽的TCP端口(默認: 11211)
-U <num> 監聽的UDP端口(默認: 11211, 0表示不監聽)
-s <file> 用於監聽的UNIX套接字路徑(禁用網絡支持)
-a <mask> UNIX套接字訪問掩碼,八進制數字(默認:0700)
-l <ip_addr> 監聽的IP地址。(默認:INADDR_ANY,全部地址)
-d 做爲守護進程來運行。
-r 最大核心文件限制。
-u <username> 設定進程所屬用戶。(只有root用戶可使用這個參數)
-m <num> 單個數據項的最大可用內存,以MB爲單位。(默認:64MB)
-M 內存用光時報錯。(不會刪除數據)
-c <num> 最大併發鏈接數。(默認:1024)
-k 鎖定全部內存頁。注意你能夠鎖定的內存上限。
試圖分配更多內存會失敗的,因此留意啓動守護進程時所用的用戶可分配的內存上限。
(不是前面的 -u <username> 參數;在sh下,使用命令"ulimit -S -l NUM_KB"來設置。)
-v 提示信息(在事件循環中打印錯誤/警告信息。)
-vv 詳細信息(還打印客戶端命令/響應)
-vvv 超詳細信息(還打印內部狀態的變化)
-h 打印這個幫助信息並退出。
-i 打印memcached和libevent的許可。
-P <file> 保存進程ID到指定文件,只有在使用 -d 選項的時候纔有意義。
-f <factor> 塊大小增加因子。(默認:1.25)
-n <bytes> 分配給key+value+flags的最小空間(默認:48)
-L 嘗試使用大內存頁(若是可用的話)。提升內存頁尺寸能夠減小"頁表緩衝(TLB)"丟失次數,提升運行效率。
爲了從操做系統得到大內存頁,memcached會把所有數據項分配到一個大區塊。
-D <char> 使用 <char> 做爲前綴和ID的分隔符。
這個用於按前綴得到狀態報告。默認是":"(冒號)。
若是指定了這個參數,則狀態收集會自動開啓;若是沒指定,則須要用命令"stats detailon"來開啓。
-t <num> 使用的線程數(默認:4)
-R 每一個鏈接可處理的最大請求數。
-C 禁用CAS。
-b 設置後臺日誌隊列的長度(默認:1024)
-B 綁定協議 - 可能值:ascii,binary,auto(默認)
-I 重寫每一個數據頁尺寸。調整數據項最大尺寸。
也能夠啓動多個守護進程,可是端口不能重複
查看memcached啓動命令
ps aux|grep memcached