memcached簡單的使用教程

來源:互聯網
上載者:User

這是工程應用性質的文章:memcached是資料快速存取的工具,wikipedia和facebook就用了它提高速度。具體情況可以wiki.

c/c++裡面使用memcached本來是很簡單的事情,但就是沒有人說,非要我去讀libmemcache的執行個體代碼才行,manpage也沒有說清楚(但還不得不看)。如果要使用memcached,步驟如下:

1 安裝memcached
  你可以去官網 上下載,也可以sudo apt-get install memcached
2 測試你剛才的安裝,
  比如運行 memcached -d -m 64 -l 127.0.0.1 -p 12300
  -d表示後台, -m 64表示使用64MB記憶體,-l 127.0.0.1 -p 12300 表示監聽127.0.0.1:12300連接埠
  沒有任何訊息就是運行成功
3 安裝libmemcached
  這個就不要apt了,因為沒有精確的libmemcached包,乖乖去官網 下載吧。這個東西還需要libevent,這個沒法apt,libevent安裝的時候最好裝到/usr/lib裡面,不然libmemcached還不能運行。
4 測試libmemcached
  找一個檔案比如test,然後運行memcp test --servers=127.0.0.1:12300
  這樣就把test拷貝到memcached管理的記憶體裡面了。
  memcat test --servers=127.0.0.1:12300
  看看是不是剛才的那個檔案。

該裝的全裝了,我們可以改代碼了。

(以下引自:wikipedia)

將純粹使用資料庫查詢的程式碼加上memcached支援是很簡單的,假設這是原來的程式碼:

function get_foo (int userid) {
   result = db_select("SELECT * FROM users WHERE userid = ?", userid);
   return result;
}
加上memcached的快取機制後:

function get_foo (int userid) {
    result = memcached_fetch("userrow:" + userid);
    if (!result) {
        result = db_select("SELECT * FROM users WHERE userid = ?", userid);
        memcached_add("userrow:" + userid,  result);
    }
    return result;
}
(wikipedia 引述完畢)
但我們需要初始化,而且需要c/c++的表述形式:
首先修改makefile,在LIBS裡面加上-lmemcached,比如原來 gcc test.c,現在 gcc test.c -lmemcached。這個庫就是libmemcached提供的。
然後添加#include<libmemcached/memcached.h>,這個檔案也是libmemcached提供的。
主函數裡面需要添加:
    memcached_st *memc;
    uint32_t  flags;
    memcached_return rc;
    memcached_server_st *servers;
    memc= memcached_create(NULL);

    servers= memcached_servers_parse("127.0.0.1:12300");
    memcached_server_push(memc, servers);
    memcached_server_list_free(servers);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
   
這就是初始化的全部代碼,可以設定很多東西,不過我現在只要一個伺服器,就看一句話:
    servers= memcached_servers_parse("127.0.0.1:12300");
這就是指明要串連到位於127.0.0.1監聽12300連接埠的memcached程式. 其他都不管。

我最後用一段修改後的代碼介紹兩個函數,memcached_get和memcached_set,都可以man出來。

        char * result_str; /*這個就是查詢的結果*/
        std::string query="要查詢的資料名";

        result_str= memcached_get(memc, query.c_str(), strlen(query.c_str()),
                &result_str_length, &flags, &rc);

        if (rc == MEMCACHED_SUCCESS)
        {
            printf("%s",result_str);
            free(result_str); /*一定要free掉 memcached傳回的資料*/

            continue;
        }
        else if (rc == MEMCACHED_NOTFOUND)
        {
            /*讀取資料*/
            ...
            rc= memcached_set(memc, query.c_str(), strlen(query.c_str()),
                    str_result.c_str(), strlen(str_result.c_str()),
                    0, 0);
        }

這東西設計得還是很好用的,libmemcached好像是物件導向c語言風格的東西,好不好用就讓我們拭目以待吧。
/////////////////////////////////////////////////////////////////////////////////
完整的例子:
#include <stdio.h>
#include <stdlib.h>
#include <libmemcached/memcached.h>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
 memcached_server_st *servers = memcached_servers_parse("127.0.0.1:22222");
 memcached_st *memc = memcached_create(NULL);
 memcached_server_push(memc, servers);
 memcached_server_list_free(servers);
 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
 string strKey = "1";
 string strValue = "hello.world";
 memcached_return rc = memcached_set(memc, strKey.c_str(), strlen(strKey.c_str()), strValue.data(), strValue.size(), 0, 0);
 if (rc == MEMCACHED_SUCCESS)
 {
  printf("memcached_set ok! /n");
  size_t ValueLength = 0;
  uint32_t flags;
  char *pValue = memcached_get(memc, strKey.c_str(), strlen(strKey.c_str()), &ValueLength, &flags, &rc);
  if (rc == MEMCACHED_SUCCESS)
  {
   printf("memcached_get key=%s value=%s /n", strKey.c_str(), pValue);
   free(pValue);
  }
 }
 memcached_free(memc);
 return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
memcached 命令
memcached 命令

 

comments 類型

 

1. storage commands: set add replace

2. retrieval commands: get

3. other commands: incr delete

 

error strings

1. "ERROR/r/n"

用戶端發送了一個不存在的command

 

2. "CLIENT_ERROR <error>/r/n"

用戶端的錯誤:用戶端發送的資料或者格式方面有問題。 <error>表示具體錯誤的原因。

 

3. "SERVER_ERROR <error>/r/n"

伺服器端的錯誤:伺服器一系列的錯誤阻止了命令的執行。<error>表示具體錯誤的原因。當發生此錯誤時。伺服器發送完了"SERVER_ERROR <error>/r/n"之後將會關閉connection。(這是唯一的關閉connection的情況)

 

descriptions of individual commands

 

1. storage commands

首先用戶端向伺服器按照如下格式發送命令列:

<command name> <key> <flags> <exptime> <bytes>/r/n

 

a) <command name> 可以是"set", "add", "replace"。

"set"表示按照相應的<key>儲存該資料。

"add"表示按照相應的<key>添加該資料,但是如果該<key>已經存在則會操作失敗。

"replace"表示按照相應的<key>替換資料,但是如果該<key>不存在則操作失敗

 

b) <key> 用戶端需要儲存資料的key。

 

c) <flags> 是一個16位的無符號的整數(以十進位的方式表示)。該標誌將和需要儲存的資料一起儲存,並在用戶端get資料時返回。客戶可以將此標誌用做特殊用途,此標誌對伺服器來說是不透明的。

 

d) <exptime> 到期的時間。如果該數值為0表示儲存的資料永遠不過時(但是,該資料有可能被其他項所替換掉。因為伺服器採用了LRU(最近最久沒有使用)的演算法替換)。如果非0(unix時間或者距離此時的秒數),當到期後,伺服器可以保證使用者得不到該資料(以伺服器時間為標準)。

 

e) <bytes> 需要儲存的位元組數(不包含最後的"/r/n"),當使用者希望儲存空資料時,<bytes>可以為0

 

f) 最後用戶端需要加上"/r/n"作為"命令頭"的結束標誌。

 

<data block>/r/n

緊接著"命令頭"結束之後就要發送資料區塊(即希望儲存的資料內容),最後加上"/r/n"作為此次通訊的結束。

 

reply

當以上資料發送結束之後,伺服器將返回一個應答。可能有如下的情況:

 

a) "STORED/r/n"

表示儲存成功

 

b) "NOT_STORED/r/n"

表示儲存失敗,但是該失敗不是由於錯誤。通常這是由於"add"或者"replace"命令本身的要求所引起的,或者該項在刪除隊列之中(見delete命令)。

 

2 retrieval command

擷取資料的格式:

 

get <key>*/r/n

 

a) <key>* 表示一個或者多個key(以空格分開)

 

b) "/r/n" 命令頭的結束

 

reply

伺服器端將返回0個或者多個的資料項目。每個資料項目都是由一個文本行和一個資料區塊組成。當所有的資料項目都接收完畢將收到"END/r/n"

 

每一項的資料結構:

VALUE <key> <flags> <bytes>/r/n

<data block>/r/n

 

a) <key> 希望得到儲存資料的key

 

b) <falg> 發送set命令時設定的標誌項

 

c) <bytes> 發送資料區塊的長度(不包含"/r/n")

 

d) "/r/n" 文本行的結束標誌

 

e) <data block> 希望接收的資料項目。

 

f) "/r/n" 接收一個資料項目的結束標誌。

 

如果有些key出現在get命令列中但是沒有返回相應的資料,這意味著伺服器中不存在這些項,這些項過時了,或者被刪除了。

 

3. delete

delete 命令格式:

delete <key> <time>/r/n

 

a) <key> 需要被刪除資料的key

 

b) <time> 用戶端希望伺服器將該資料刪除的時間(unix時間或者從現在開始的秒數)

 

c) "/r/n" 命令頭的結束

 

reply

 

a) "DELETED/r/n" 刪除成功

 

b) "NOT_FOUND/r/n" 需要刪除的key不存在

 

ps:"flush_all" command 可以所有項都無效。

 

4. increment/decrement

 

command "incr" "decr" 是用來改變資料項目數值的命令。設定資料項目的資料被認為是一個10進位的無符號的整數。如果當前設定的值不能夠被轉換則認為是0.如果該資料項目的key不存在,則執行命令失敗!

 

命令格式:

 

incr <key> <value>/r/n

or

decr <key> <value>/r/n

 

a) <key> 資料項目的key

 

b) <value> 使用者希望增加/減少的資料的數值.該數值是一個32位十進位的無符號整形變數。

 

c) "/r/n" 命令列結束標誌

 

reply

 

a) "NOT_FOUND/r/n" 沒有找到需要操作的項。

 

b) "<value>/r/n" <value>資料項目有效期間的最新剩餘時間。

 

注意: 

a) 如果一個資料項目的有效期間被設定為0,這時使用decr命令是無法減少資料。

 

b) 如果要執行 incr key -1 的操作不會有什麼問題,結果和你希望的一樣。但是,執行decr -1時的結果一定會讓你覺得很意外,因為它的結果無論key的資料是什麼結果的都是0.原因是:在這兩個命令的執行過程中都是吧-1當做一個無符號的整形處理的。

 

c) 執行decr命令時資料的長度不會隨之而減小,而是在返回資料的後面填補空格。但是執行incr命令越界後會自動的增加資料的位元。

 

 

 

5. 其他命令

 

"stats": 用來查詢服務器提供的內部資料。

 

stats <args>/r/n

查詢特定的資料

 

reply

 

STAT <name> <value>/r/n

...

END/r/n

 

"quit"

"quit/r/n": 退出程式

///////////////////////////////////////////////////////////////////////////////////////////////////

對於 Memcached 緩衝系統的基本介紹、安裝以及應用 之前有一編文章說過,下面主要是對使用Memcached系統的基本命令以及協議作個簡單的分析,個人學習的筆記,呵呵。還希望能給需要的筒子一點參考:

一、Memcache物件導向的常用介面包括:
Memcache::connect -- 開啟一個到Memcache的串連
Memcache::pconnect -- 開啟一個到Memcache的長串連
Memcache::close -- 關閉一個Memcache的串連
Memcache::set -- 儲存資料到Memcache伺服器上
Memcache::get -- 提取一個儲存在Memcache伺服器上的資料
Memcache::replace -- 替換一個已經存在Memcache伺服器上的項目
Memcache::delete -- 從Memcache伺服器上刪除一個儲存的項目
Memcache::flush -- 重新整理所有Memcache伺服器上儲存的項目(類似於刪除所有的儲存的項目)
Memcache::getStats -- 擷取當前Memcache伺服器啟動並執行狀態

For More: http://cn.php.net/memcache

二、查看系統的運行狀態:

 
pid               Process id of this server process (memcache伺服器的進程ID)
uptime            Number of seconds this server has been running (伺服器已經啟動並執行秒數)
time              Current UNIX time according to the server (伺服器當前的UNIX時間)
version           Version string of this server (memcache版本)
pointer_size      Current system pointer 當前作業系統的指標大小(32位系統一般是32bit)
rusage_user       Accumulated user time for this process (該進程累計的使用者時間(秒:微妙))
rusage_system     Accumulated system time for this process (該進程累計的系統時間(秒:微妙))
curr_items        Current number of items stored by the server (伺服器當前儲存的內容數量)
total_items       Total number of items stored by this server ever since it started (伺服器啟動以來儲存過的內容總數)
bytes             Current number of bytes used by this server to store items (伺服器當前儲存內容所佔用的位元組數)
curr_connections  Number of open connections (當前開啟著的串連數量)
total_connections Total number of connections opened since the server started running (伺服器運行以來接受的串連總數)
connection_structures Number of connection structures allocated by the server (伺服器分配的串連結構的數量)
cmd_get             Cumulative number of retrieval requests (get命令(擷取)總請求次數)
cmd_set             Cumulative number of storage requests (set命令(儲存)總請求次數)
get_hits            Number of keys that have been requested and found present (請求成功的總次數)
get_misses          Number of items that have been requested and not found (請求失敗的總次數)
threads             Current number of thread (當前線程數)
bytes_read          Total number of bytes read by this server from network (伺服器從網路讀取到的總位元組數)
bytes_written       Total number of bytes sent by this server to network (伺服器向網路發送的總位元組數)
limit_maxbytes      Number of bytes this server is allowed to use for storage. (伺服器在儲存時被允許使用的位元組總數)
evictions           Number of valid items removed from cache to free memory for new items (為擷取空閑記憶體而刪除的items數(分配給memcache的空間用滿後需要刪除舊的items來得到空間分配給新的items))

其中,最關注最多的幾個參數:
uptime:是memcached啟動並執行秒數。
cmd_get:是查詢快取的次數。
cmd_get/uptime 結果是平均每秒請求緩衝的次數——結果值越大,說明Memcached的利用率越高,網站的訪問量大,如果太低,用檔案系統快取就可以了,根本不會體現出使用memcached的強大效能。
cmd_set:是設定key=>value的次數。整個memcached是個大hash,用cmd_get沒有找到的內容,就會調用一下cmd_set寫進緩衝裡。
get_hits:是快取命中的次數。所謂的命中率 = get_hits/cmd_get * 100%。
get_misses:是緩衝未命中的次數。get_misses加上get_hits就等於cmd_get。
stats:顯示伺服器資訊、統計資料等
stats reset:清空統計資料

stats slabs:顯示各個slab的資訊,包括chunk的大小、數目、使用方式等
stats items:顯示各個slab中item的數目和儲存時間長度(最後一次訪問距離現在的秒數)
quit:退出

三、利用shell命令操作Memcached
1、資料存放區(key為wan,value為123)
 
2、資料取回
 
3、替換資料(將以wan為key儲存的值替換為122)
 
4、數值增加 1
 
5、數值減少 2
 
6、資料刪除
 
7、查看Memcached當時狀態
printf "stats/r/n" | nc 127.0.0.1 11211
8、查看Memcached即時狀態

watch "printf 'stats/r/n' | nc 127.0.0.1 11211"

 

Memcached protocol 中英文檔可以參考:

http://blog.s135.com/book/memcached/

四. 查看slabs的使用狀況
使用memcached的創造著Brad寫的名為 memcached-tool 的Perl指令碼,可以方便地獲得slab的使用方式(它將memcached的傳回值整理成容易閱讀的格式)。可以從下面的地址獲得指令碼:
http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool
[root@localhost html]# vim memcached-tool
[root@localhost html]# chmod +x memcached-tool
[root@localhost html]# ./memcached-tool 127.0.0.1:11211
  #  Item_Size   Max_age  1MB_pages Count   Full?
  1      80 B        0 s               1           0      no
  2     104 B       12175 s         1           1      no
  3     176 B    1339587 s       33       196567  yes

各列的含義:
#: slab class編號
Item_Size: Chunk大小
Max_age: LRU內最舊的記錄的存留時間
1MB_pages: 分配給Slab的頁數
Count: Slab內的記錄數
Full?: Slab內是否含有空閑chunk

五. 也可以圖形化監控 Memcached 的運行狀態
http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/
是一個PHP源檔案,只需要修改源碼中的使用者名稱、密碼以及數組$MEMCACHE_SERVERS 就可以了。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/ctowoo/archive/2009/10/14/4672649.aspx

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/JsuFcz/archive/2009/11/19/4836866.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.