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は今のところ使用予定はないのでメモだけ残しとく。