メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年5月9日金曜日

[libmemcached] libmemcachedを使ってみる

libmemcacheは開発終了とのことで、libmemcachedを使ってみることに。

教えてもらった
http://alpha.mixi.co.jp/blog/?p=119
を読破。

まず、http://tangent.org/552/libmemcached.html
からlibmemcachedをダウンロードっす。
現行0.20が最新かもしれません。

そしたら、展開。


$ tar xvzf libmemcached-0.20.tar.gz
 

で、configure。

$ cd libmemcached-0.20
$ ./configure
 

で、make。

$ make
 


へー。
libmemcachedではマニュアルをpodで書いてるんだー。
libmemcacheよりもドキュメントがそろってそうな。
というのは置いといて、

インストール。

$ sudo make install
 

インストール完了。
念のため、

# ldconfig
 

も。


早速へぼいプログラムを作ってみる。
やりたいことは、
  • set
  • get
  • delete
  • add
の4点。
libmemcachedではマスターキーという概念があるようだが、とりあえずはほっておく。
で、1つづつやってみる。
と、その前に、

$ man 3 libmemcached_examples
 

を見る。

memcachedと通信するためには、まずmemcached_stなる構造体を
用意しなくちゃならない。この構造体は使った後には解放する。
なので、大きな流れとしては以下な感じ。

memcached_st *memc;
memcached_return rc;

memc = memcached_create(NULL);

/* ここら辺でなんかする */

memcached_free(memc);
 


サーバへのつなぎ方は以下な感じ。
まず、memcached_server_st構造体にmemcached_server_list_append関数を使って
接続するサーバを追加する。
追加し終わったら、そのmemcached_server_st構造体をmemcached_stへmemcached_server_push関数を使ってpush。
使い終わったら、memcached_server_stは解放する。

memcached_server_st *servers;
memcached_st *memc;
memcached_return rc;

/* memcached_st生成 */
memc = memcached_create(NULL);

/* サーバリスト生成
* server名=192.168.1.250
* ポート番号=11211
*/
servers = memcached_server_list_append(NULL, "192.168.1.250", 11211, &rc);
/* サーバリスト生成
* server名=192.168.1.250
* ポート番号=11212
*/
servers = memcached_server_list_append(servers, "192.168.1.250", 11212, &rc);

/* memcへpush */
rc = memcached_server_push(memc, servers);

/* memcached_server_st解放 */
/* man 3 libmemcached_examplesだとmemcahced_server_free()と書いてある */
memcached_server_list_free(servers);

 



ということでプログラムを早速作ってみる。
値をセットするだけのへぼいプログラム

/*
* gcc -o mset mset.c -I/usr/local/include -lmemcached
*/
#include <libmemcached/memcached.h>
#include <string.h>
#include <stdio.h>


static void usage(char *argv[]);

int
main(int argc, char *argv[])
{
memcached_st *memc;
memcached_server_st *servers;
memcached_return rc;

if (argc != 3) {
usage(argv);
return -1;
}

/* 初期化 */
memc = memcached_create(NULL);
servers = memcached_server_list_append(NULL, "192.168.1.250", 11211, &rc);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* memcへserversをpush */
rc = memcached_server_push(memc, servers);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* serversを解放 */
memcached_server_list_free(servers);

rc= memcached_set(memc, argv[1], strlen(argv[1]),
argv[2], strlen(argv[2]),
(time_t)600, (uint32_t)0);
if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
memcached_free(memc);
return -2;
}
/* 解放 */
memcached_free(memc);
return 0;
}


static void
usage(char *argv[])
{
fprintf(stderr, "Usage: %s key value\n", argv[0]);
}
 


man 3 libmemcached_examplesを見ると、memcached_server_free()と
書いてあるが、その名前のシンボルはlibmemcachedには無いようだ。
代わりにmemcached_server_list_free()を使用して解放する。

値をgetするだけのへぼいプログラム


/*
* gcc -o mget mget.c -I/usr/local/include -lmemcached
*/
#include <libmemcached/memcached.h>
#include <string.h>
#include <stdio.h>


static void usage(char *argv[]);

int
main(int argc, char *argv[])
{
memcached_st *memc;
memcached_server_st *servers;
memcached_return rc;
char *value;
size_t value_length;
uint32_t flags;

if (argc != 2) {
usage(argv);
return -1;
}

/* 初期化 */
memc = memcached_create(NULL);
servers = memcached_server_list_append(NULL, "192.168.1.250", 11211, &rc);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* memcへserversをpush */
rc = memcached_server_push(memc, servers);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* serversを解放 */
memcached_server_list_free(servers);

value= memcached_get(memc, argv[1], strlen(argv[1]),
&value_length, &flags, &rc);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
memcached_free(memc);
return -2;
}
/* 印字 */
fprintf(stderr, "value:[%s]\n", value);
free(value);
/* 解放 */
memcached_free(memc);
return 0;
}


static void
usage(char *argv[])
{
fprintf(stderr, "Usage: %s key\n", argv[0]);
}
 

気をつけるべきは、memcahced_get()の戻り値を使用した後、free()しなきゃならないことぐらいか。


値をdeleteするだげのしょぼいプログラム

/*
* gcc -o mdelete mdelete.c -I/usr/local/include -lmemcached
*/
#include <libmemcached/memcached.h>
#include <string.h>
#include <stdio.h>


static void usage(char *argv[]);

int
main(int argc, char *argv[])
{
memcached_st *memc;
memcached_server_st *servers;
memcached_return rc;
char *value;
size_t value_length;
uint32_t flags;

if (argc != 2) {
usage(argv);
return -1;
}

/* 初期化 */
memc = memcached_create(NULL);
servers = memcached_server_list_append(NULL, "192.168.1.250", 11211, &rc);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* memcへserversをpush */
rc = memcached_server_push(memc, servers);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* serversを解放 */
memcached_server_list_free(servers);

/* 削除 */
rc= memcached_delete(memc, argv[1], strlen(argv[1]), (time_t)0);
if (rc != MEMCACHED_SUCCESS && rc == MEMCACHED_BUFFERED) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
memcached_free(memc);
return -2;
}

/* 解放 */
memcached_free(memc);
return 0;
}


static void
usage(char *argv[])
{
fprintf(stderr, "Usage: %s key\n", argv[0]);
}
 

特に難しいことは無い。
memcached_deleteを使用するだけ。


値をaddするだけのしょぼいプログラム

/*
* gcc -o madd madd.c -I/usr/local/include -lmemcached
*/
#include <libmemcached/memcached.h>
#include <string.h>
#include <stdio.h>


static void usage(char *argv[]);

int
main(int argc, char *argv[])
{
memcached_st *memc;
memcached_server_st *servers;
memcached_return rc;

if (argc != 3) {
usage(argv);
return -1;
}

/* 初期化 */
memc = memcached_create(NULL);
servers = memcached_server_list_append(NULL, "192.168.1.250", 11211, &rc);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* memcへserversをpush */
rc = memcached_server_push(memc, servers);
if (rc != MEMCACHED_SUCCESS) {
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
return -2;
}
/* serversを解放 */
memcached_server_list_free(servers);

/* あっど */
rc = memcached_add(memc, argv[1], strlen(argv[1]),
argv[2], strlen(argv[2]),
(time_t)600, (uint32_t)0);

if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_STORED && rc != MEMCACHED_NOTSTORED) {
/* 値がセットされていない状態でaddするとMEMCACHED_SUCCESSが返ってくる。 */
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
memcached_free(memc);
return -2;
}
fprintf(stderr, "%s\n", memcached_strerror(memc, rc));

/* 解放 */
memcached_free(memc);
return 0;
}


static void
usage(char *argv[])
{
fprintf(stderr, "Usage: %s key value\n", argv[0]);
}
 

値がセットされていない状態でaddするとMEMCACHE_SUCCESSがrcに設定される。
値がセットされている上体でaddするとMEMCACHE_NOTSTOREDがrcに設定される。


とりあえず、必要そうな部分の簡単なプログラムを作ってみた。

おしまい。
.

0 コメント: