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

2008年5月8日木曜日

[libmemcache] libmemcacheを使ってクライアントを作ってみる

apr_memcacheの代わりにlibmemcacheを使えないか、と思いmemcacheクライアントを作ってみる。

必要なパッケージ(Debian-Etchの場合)は以下のとおり。

  • libmemcache0
  • libmemcache-dev
apt-getでインストールする。

で、早速プログラミング。

値を設定する場合の全体の流れは多分以下のとおり。
  1. struct memcacheの領域を確保。
  2. struct memcache構造体にサーバを追加。
  3. タイムアウト等の諸設定
  4. mc_setをコール
  5. struct memcache構造体領域の解放

値を取得する場合の全体の流れは多分以下のとおり。
  1. struct memcache構造体領域を確保
  2. struct memcache構造体にサーバを追加
  3. タイムアウト等の諸設定
  4. struct memcache_req構造体の領域を確保
  5. struct memcache_req構造体に対してキーを追加し、レスポンス領域(struct memcache_res)へのポインタを取得
  6. mc_get等の関数をコール
  7. struct memcache_res構造体からレスポンスデータを取得
  8. struct memcache_res構造体領域を開放
  9. struct memcache構造体領域を開放
な感じで、”多分”良さそう。

サーバに値をセットするプログラム

#include <memcache.h>
#include <stdio.h>

int
main()
{
struct memcache *mc ;
int ret;

/* struct memcache構造体領域を確保 */
mc = mc_new();

/* サーバの追加 */
ret = mc_server_add4(mc, "192.168.1.250:11211");
if (ret != MCM_ERR_NONE) {
fprintf(stderr, "failed: mc_server_add4():[%d]\n", ret);
mc_free(mc);
return -1;
}

/* タイムアウトの設定(60秒でタイムアウト) */
/*
* sec = 60秒
* usec = 0
*/
mc_timeout(mc, 60, 0);

/* 値の設定 */
/* key="test-key" */
/* val="test-data" */
/* expire= 600秒 */
/* flags=0 */
ret = mc_set(mc, "test-key", sizeof("test-key")-1, "test-data", sizeof("test-data")-1, 600, 0);
if (ret != MCM_ERR_NONE) {
fprintf(stderr, "failed: mc_set():[%d]\n", ret);
mc_free(mc);
return -2;
}
mc_free(mc);
return 0;
}
 

な感じ。

実行してみる。

$ gcc -o b b.c -lmemcache
$ ./b



書かれたかどうかをチェック。

$ telnet 192.168.1.250 11211
Trying 192.168.1.250...
Connected to 192.168.1.250.
Escape character is '^]'.
get test-key 0 0 0
VALUE test-key 0 9
test-data
END
 

書かれているっぽい。



サーバから値を取得してみるプログラム

#include <memcache.h>
#include <stdio.h>

int
main()
{
struct memcache *mc ;
struct memcache_req *mcr;
struct memcache_res *res;
int ret;

/* struct memcache構造体領域を確保 */
mc = mc_new();

/* サーバの追加 */
ret = mc_server_add4(mc, "192.168.1.250:11211");
if (ret != MCM_ERR_NONE) {
fprintf(stderr, "failed: mc_server_add4():[%d]\n", ret);
mc_free(mc);
return -1;
}

/* タイムアウトの設定(60秒でタイムアウト) */
/*
* sec = 60秒
* usec = 0
*/
mc_timeout(mc, 60, 0);

/* 値の取得
*/
mcr = mc_req_new();
res = mc_req_add(mcr, "test-key", sizeof("test-key")-1);
mc_get(mc, mcr);


/* 取得した値を出力 */
fprintf(stderr, "res->key:[%s] res->val:[%s]\n", res->key, res->val);

mc_req_free(mcr);
mc_free(mc);

return 0;
}
 


早速、実行。

$ gcc -o c c.c -lmemcache
$ ./c
res->key:[test-key] res->val:[test-data]
 

取得できた。

.

3 コメント:

bayside さんのコメント...

釈迦に説法かもしれませんが、
http://alpha.mixi.co.jp/blog/?p=119
これによると、libmemcache より libmemcached が推奨されているようですね。mixiの技術ブログも非常に濃くて面白いです。

konn さんのコメント...

むむ?

libmemcacheは開発停止??
早速、libmemcachedを触ってみます。

konn さんのコメント...

つか、http://alpha.mixi.co.jp/blog/?p=119
素敵っすね。