Memcache技術筆記

Memcache技術筆記

 

一、基本概念

1. 緣起:

在數據驅動的web開發中,經常要重複從數據庫中取出相同的數據,這種重複極大的增加了數據庫負載。緩存是解決這個問題的好辦法。但是Web中的雖然已經可以實現對頁面局部進行緩存,但還是不夠靈活。此時Memcached或許是你想要的。

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


二、安裝:

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> telnet 127.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連接測試

statsmemcache命令:查看當前狀態

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

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 變量名

get one

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 –an|find “11211”

 

netstat -an |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服務操作:

存數據

set my1 1 3600 4

aaa

//過期時間爲0永久不過期,存儲4個字節數據,第二個參數是個標記,設置爲0,不爲0,php頁面取不到從cmd中插入的數據

 

取數據

get my1

 

:

1.add

2.set

 

:

1.delete my1

2.flush_all

 

:

1.set

2.replace

 

:

1.get

2.stats

3.stats items

4.stats cachedump 1 0

5.stats sizes

 

php操作memcache:

連接memcache服務:

$mem=new Memcache;

$mem->connect("localhost","11211");

 

:

$mem->add($key,$value,是否壓縮,過期時間);

$mem->set($key,$value,是否壓縮,過期時間);

 

:

$mem->delete($key);

$mem->flush();

 

:

curr_items 1

$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服務器所在主機操作系統的指針大小,一般爲3264.

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 1284memcached服務器從網絡讀取的總的字節數。

STAT bytes_written 5362memcached服務器發送到網絡的總的字節數。

STAT limit_maxbytes 67108864 memcached服務緩存允許使用的最大字節數。這裏爲67108864字節,也就是是64M.與我們啓動memcached服務設置的大小一致。

STAT threads 1被請求的工作線程的總數量。

END

發佈了17 篇原創文章 · 獲贊 23 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章