Memcache技術筆記

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章