mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

libmemcachedを使用したmemcachedへのアクセス(get)

libmemcachedライブラリを使用してmemcachedにアクセスするサンプルを作ったのでメモ。

準備

libmemcachedとlibmemcached-develをyumでインスト。
インストしたライブラリのバージョンは以下。

================================================================================
 Package              Arch           Version                 Repository    Size
================================================================================
Installing:
 libmemcached         x86_64         0.31-1.1.el6            base          80 k
 libmemcached-devel   x86_64         0.31-1.1.el6            base         116 k

サンプルソース

memcachedに接続して、引数で指定されたキーのデータを取得して表示する。

#ifdef __cplusplus
extern "C" {
#endif

#include <cstdlib>
#include <libmemcached/memcached.h>
#include <stdio.h>
#include <string.h>

static memcached_st* memcached_cl_init() {
	memcached_return rc;

	memcached_st* memc = memcached_create(NULL);
	if (memc == NULL) {
		fprintf(stderr, "memcached_create error.");
		return NULL;
	}
	memcached_server_st* servers =
			memcached_server_list_append(NULL, "127.0.0.1", 11211, &rc);
	if ( rc != MEMCACHED_SUCCESS ) {
		fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
		return NULL;
	}
//	printf("count:%u\n", memcached_server_list_count(servers));
	rc = memcached_server_push(memc, servers);
	if ( rc != MEMCACHED_SUCCESS ) {
		fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
		return NULL;
	}

	memcached_server_list_free(servers);
	return memc;		
}

int main(int argc, char** argv) {
	if ( argc <= 1 ) {
		fprintf(stderr, "Usage: %s get-key\n", argv[0]);
		return 1;
	}
	const char* key = argv[1];

	memcached_st* memc = memcached_cl_init();
	if ( memc == NULL ) {
		return 2;
	}

	memcached_return rc;
	size_t	val_len;
	char*	val;
	uint32_t	flags;

	val = memcached_get(memc, key, strlen(key), &val_len, &flags, &rc);
	if ( rc != MEMCACHED_SUCCESS ) {
		fprintf(stderr, "cannot read data %s\n", key);
		fprintf(stderr, "%s\n", memcached_strerror(memc, rc));
	} else {
		printf("data length=%u\n", val_len);
		printf("data :\n"
				"----------\n"
				"%s\n"
				"----------\n", val);
	}
	free(val);
	memcached_free(memc);

	return 0;
}

#ifdef __cplusplus
}
#endif

コンパイル

$ g++ -o memcached_client -g -I/usr/include  -L/usr/lib64 -lmemcached main.cpp

実行

前回登録したデータを表示してみた。

$ ./memcached_client data1
data length=30
data :
----------
1200 strings string2 290000.12
----------
$ ./memcached_client xmldata1
data length=68
data :
----------
<val1>2400</val1> <string value="string1"/> <string>string2</string>
----------
$ ./memcached_client xmldata2
data length=98
data :
----------
<val1>
	<integer>2400</integer>
	<string value="string1"/>
	<string>string2</string>
</val1>

----------
$ ./memcached_client none
cannot read data none
NOT FOUND
$ 

memcached_getの復帰値がchar*というところで想像はしてたけど、取得したデータは全て単一の文字列。その文字列をどう扱うかはアプリ任せになるっぽい。

データの取得APIとして、他に、memcahced_mgetというメソッドもあり、これは複数のキー指定で、一括でデータを取得できるっぽい。
けど、memcached_fetchかmemcached_fetch_resultをコールする必要があるなど、使い方が少々面倒っぽい。
こっちのAPIは今のところ使用予定はないのでメモだけ残しとく。