Memcache技術筆記
一、基本概念
1. 緣起:
在數據驅動的web開發中,經常要重複從數據庫中取出相同的數據,這種重複極大的增加了數據庫負載。緩存是解決這個問題的好辦法。但是Web中的雖然已經可以實現對頁面局部進行緩存,但還是不夠靈活。此時Memcached或許是你想要的。
注意Memcache與Memcached的關係:Memcache是該系統的項目名稱,Memcached是該系統的主程序文件(字母d可以理解爲daemon),以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的連接操作,使用共享內存存取數據
2. Memcached是什麼?
Memcached是由Danga Interactive開發的,高性能的,分佈式的內存對象緩存系統,用於在動態應用中減少數據庫負載,提升訪問速度。
3. Memcached能緩存什麼?
通過在內存裏維護一個統一的巨大的hash表(其實就是一個鍵值對),Memcached能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。
4. Memcached快麼?
非常快。Memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數量的打開鏈接,使用非阻塞的網絡I/O,對內部對象實現引用計數(因此,針對多樣的客戶端,對象可以處在多樣的狀態),使用自己的頁塊分配器和哈希表,因此虛擬內存不會產生碎片並且虛擬內存分配的時間複雜度可以保證爲O(1)。
Danga Interactive爲提升Danga Interactive的速度研發了Memcached。
5. Memcached的特點
Memcached的緩存是一種分佈式的,可以讓不同主機上的多個用戶同時訪問,因此解決了共享內存只能單機應用的侷限,更不會出現使用數據庫做類似事情的時候,磁盤開銷和阻塞的發生。
緩存數據:
1.在內存中緩存數據 2.數據形態以key->value結構 3.安全度非常差的
軟件:
1.memcache模塊
讓php支持memcache的函數,可以去連接memcache服務,進行增、刪、改、查
2.memcached 提供memcache服務,11211
學習memcache:
1.memcache服務器操作
2.用php去操作memcache
memcache客戶端(php)
PHP有兩個memcache客戶端:php memcache和php memcached。
php memcache獨立用php實現,是老客戶端,從我們實踐中已發現有多個問題,而且功能少,屬性也可設置的少;
http://pecl.php.net/package/memcache
php memcached是基於原生的c的libmemcached的擴展,更加完善,建議替換爲php memcached。
http://pecl.php.net/package/memcached
二、安裝:
1. Windows下操作:
1.1 在網上下載memcached-1.2.1-win32.zip。解壓放某個盤下面,
比如在c:\memcached
1.2 在終端(cmd)下:
D:\AppServ>memcached.exe-d install 安裝
D:\AppServ>memcached.exe-d uninstall 卸載
D:\AppServ>memcached.exe-d start 啓動
D:\AppServ>memcached.exe-d stop 停止
memcached.exe -h 獲取所有幫助
1.3 在啓動之後連接:
D:\AppServ> telnet127.0.0.1 11211 --連接memcache端口11211
使用quit退出。
1.4 其他命令參數:
啓動Memcache 常用參數
-p <num> 設置端口號(默認不設置爲: 11211)
-U <num> UDP監聽端口(默認: 11211, 0 時關閉)
-l <ip_addr> 綁定地址(默認:所有都允許,無論內外網或者本機更換IP,
有安全隱患,若設置爲127.0.0.1就只能本機訪問)
-d 獨立進程運行
...-d start 啓動memcached服務
...-d restart 重起memcached服務
...-d stop|shutdown 關閉正在運行的memcached服務
...-d install 安裝memcached服務
...-d uninstall 卸載memcached服務
-u <username> 綁定使用指定用於運行進程<username>
-m <num> 允許最大內存用量,單位M (默認: 64 MB)
-P <file> 將PID寫入文件<file>,可以使得後邊進行快速進程終止, 需要與-d 一起使用
-M 內存耗盡時返回錯誤,而不是刪除項
-c 最大同時連接數,默認是1024
-f 塊大小增長因子,默認是1.25
-n 最小分配空間,key+value+flags默認是48
-h 顯示幫助
2. Linux下安裝操作:
2.1 #安裝memcache源代碼
http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz
a. 首先安裝依賴包libevent
Yum –y install libevent*
b. #主包已經安裝,別忘記安裝libevent-devel*,不然./configure過不去
tar xzf/lamp/memcached-1.4.10.tar.gz 解壓memcached
cd /lamp/memcached-1.4.10 進入 memcached目錄
./configure--prefix=/usr/local/memcache 配置
make && make install 編譯與安裝
useradd memcache 添加memcache用戶
c. #因爲系統不能用root運行memcache軟件
/usr/local/memcache/bin/memcached –umemcache& #後臺運行
netstat –tunpl|grep :11211 查看端口
telnet 192.168.10.1 11211 連接測試
stats memcache命令:查看當前狀態
d. 寫入自啓動:
vi /etc/rc.local
/usr/local/memcache/bin/memcached –umemcache&
e. #如何殺掉後臺進程
pkill memcached
2.2 編譯安裝memcache
tar zxvf memcache-2.2.5.tgz 解壓軟件包
cd memcache-2.2.5 進入目錄
/usr/local/php/bin/phpize 生成配置環境
./configure --with-php-config=/usr/local/php/bin/php-config 配置
make && make install 編譯和安裝
修改php.ini
extension_dir ="/usr/local/php//lib/php/extensions/no-debug-non-zts-20060613/"
extension="memcache.so";
1.安裝memcache
2.連接memcache服務器,並進行增、刪、改、查操作
3.用php連接memcache服務器,並進行增、刪、改、查操作
三、memcached的命令
---------------------------------------------------
連接 telnet 127.0.0.1 11211
注意:如果找不到telnet:控制面板/程序與功能/打開或關閉Windows功能/找到Telnet服務器、Telnet客戶端兩項勾選上。
注意:也通過xshell連接,端口是11211
1.【錯誤指令】
Memcache的協議的錯誤部分主要是三個錯誤提示之提示指令:
ERROR -- 普通錯誤信息,比如指令錯誤之類的
CLIENT_ERROR <錯誤信息> -- 客戶端錯誤
SERVER_ERROR <錯誤信息> --服務器端錯誤
2.【數據操作命令】
格式:<命令> <鍵><標記> <有效期> <數據長度>
其中:
<鍵> -key,是發送過來指令的key內容
<標記> - flags,是調用set指令保存數據時候的flags標記
有效期:是數據在服務器上的有效期限,如果是0,則數據永遠有效,單位是秒
數據的長度,block data 塊數據的長度,一般在這個個長度結束以後下一行跟着block data數據內容,
發送完數據以後,客戶端一般等待服務器端的返回,服務器端的返回:
STORED 數據保存成功
NOT_STORED數據保存失敗,是因爲服務器端這個數據key已經存在
2.1添加數據
格式:add 變量名 標記位 時間 長度
例: add one 1 100000 10
1234567890
3. 獲取 get 變量名
getone
get<鍵>*
<鍵>* - key
key是是一個不爲空的字符串組合,發送這個指令以後,等待服務器的返回。如果服務器端沒有任何數據,則是返回:
END
4. 修改 set|replace 變量名 標記位 時間(秒) 長度
5. delete <鍵> <超時時間>
<鍵> - key,希望在服務器上刪除數據的key鍵
<超時時間> - timeout
按照秒爲單位,這個是個可選項,如果沒有指定這個值,那麼服務器上key數據將馬上被刪除,
如果設置了這個值,那麼數據將在超時時間後把數據清除,該項缺省值是0,就是馬上被刪除
刪除數據後,服務器端會返回:
DELETED 刪除數據成功
NOT_FOUND 這個key沒有在服務器上找到.
6. flush_all 這個指令執行後,服務器上所有緩存的數據都被刪除,並且返回:OK
7. stats items 看選項號
stats cachedump 選項號 (0|n)
只能看到變量, 值使用 get獲取
如果查看memcache已經啓動:
1.服務列表 services.msc
2.查看進程 tasklist|find “11211”
3.查看端口 netstat –ano|find “11211”
netstat-ano |find "11211" 查看端口
tasklist 進程樹
啓動參數:
memcached.exe-d -m 2048 -u root -l 192.168.1.20 -p 12111 -c 1024
-m 設置內存
-u 登錄用戶
-l 監聽網卡
-p 監聽端口
-c 併發用戶
memcache服務操作:
存數據
setmy1 1 3600 4
aaa
//過期時間爲0永久不過期,存儲4個字節數據,第二個參數是個標記,設置爲0,不爲0,php頁面取不到從cmd中插入的數據
取數據
getmy1
增:
1.add
2.set
刪:
1.deletemy1
2.flush_all
改:
1.set
2.replace
查:
1.get
2.stats
3.statsitems
4.statscachedump 1 0
5.stats sizes
php操作memcache:
連接memcache服務:
$mem=newMemcache;
$mem->connect("localhost","11211");
增:
$mem->add($key,$value,是否壓縮,過期時間);
$mem->set($key,$value,是否壓縮,過期時間);
刪:
$mem->delete($key);
$mem->flush();
改:
curr_items1
$mem->set($key,$value,是否壓縮,過期時間);
查:
$mem->get($key);
$mem->getStats();
$mem->getVersion();
參考:
Stats這裏顯示了很多狀態信息,下邊詳細解釋每個狀態項:
STAT pid 1552 服務進程的進程ID
STAT uptime 3792 服務從啓動到當前所經過的時間,單位是秒。
STAT time 1262517674 服務器所在主機當前系統的時間,單位是秒。
STAT version 1.2.6 組件的版本。這裏是我當前使用的1.2.6。
STAT pointer_size 32 服務器所在主機操作系統的指針大小,一般爲32或64.
STAT curr_items 1 表示存放當前的所有緩存對象的數量。不包括已經從緩存中刪除的對象。
STAT total_items 2 表示從啓動到當前,系統存儲過的所有對象數量,包括已經刪除的對象。
STAT bytes 593 表示系統存儲緩存對象所使用的存儲空間,單位爲字節。
STAT curr_connections 2 表示當前系統打開的連接數。
STAT total_connections 28 表示從memcached服務啓動到當前時間,系統打開過的連接的總數。
STAT connection_structures 9表示從memcached服務啓動到當前時間,被服務器分配的連接結構的數量,這個解釋是協議文檔給的,具體什麼意思,我目前還沒搞明白。
STAT cmd_get 3 累積獲取數據的數量,這裏是3,因爲我測試過3次,第一次因爲沒有序列化對象,所以獲取數據失敗,是null,後邊有2次是我用不同對象測試了2次。
STAT cmd_set 2 累積保存數據的樹立數量,這裏是2.雖然我存儲了3次,但是第一次因爲沒有序列化,所以沒有保存到緩存,也就沒有記錄。
STAT get_hits 2 表示獲取數據成功的次數。
STAT get_misses 1 表示獲取數據失敗的次數。
STAT evictions 0 爲了給新的數據項目釋放空間,從緩存移除的緩存對象的數目。比如超過緩存大小時根據LRU算法移除的對象,以及過期的對象。
STAT bytes_read 1284 memcached服務器從網絡讀取的總的字節數。
STAT bytes_written 5362 memcached服務器發送到網絡的總的字節數。
STAT limit_maxbytes 67108864 memcached服務緩存允許使用的最大字節數。這裏爲67108864字節,也就是是64M.與我們啓動memcached服務設置的大小一致。
STAT threads 1 被請求的工作線程的總數量。
END