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
も。
早速へぼいプログラムを作ってみる。
やりたいことは、
の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に設定される。
とりあえず、必要そうな部分の簡単なプログラムを作ってみた。
おしまい。
.