memcachedとC++の連携:接続の確立

公式ドキュメントを参照:http://docs.libmemcached.org/index.html

初心者向けチュートリアルによると、C++でmemcachedに接続するクライアントが実装されています。

apt-cache searchコマンドを使用して、必要なライブラリを検索しました。

root@iZwz9aujzgp9b5o38x29akZ:~# apt-cache search memcached | grep C++
libmemcached-dev - memcachedサーバーへのCおよびC++クライアントライブラリ(開発ファイル)
libmemcached11 - memcachedサーバーへのCおよびC++クライアントライブラリ

そこでlibmemcached-devとlibmemcached11をそれぞれインストールしました。

root@iZwz9aujzgp9b5o38x29akZ:~# apt-get install libmemcached11
.....//省略
root@iZwz9aujzgp9b5o38x29akZ:~# apt-get install libmemcached-dev
.....//省略

次にヘッダーファイルの場所を確認しました。

root@iZwz9aujzgp9b5o38x29akZ:~# cd /usr/include/libmemcached/
root@iZwz9aujzgp9b5o38x29akZ:/usr/include/libmemcached# ll
合計 20
drwxr-xr-x  2 root root 4096 1月 19 19:16 ./
drwxr-xr-x 40 root root 4096 1月 19 19:15 ../
-rw-r--r--  1 root root 1713 1月 18  2019 memcached.h
-rw-r--r--  1 root root 1717 1月 18  2019 memcached.hpp
-rw-r--r--  1 root root 1714 1月 18  2019 util.h

これはlibmemcachedの公式ドキュメントに一致しています。

次に、テストプログラムを作成してmemcachedに接続します。

公式ドキュメントのリソースを参考に、以下のテストプログラムを作成しました。

vim memcached_connection_test.cpp 
 1 #include <iostream>
 2   
 3 #include <string.h>
 4 #include <libmemcached/memcached.h>
 5 
 6 using namespace std;
 7 int main()
 8 {
 9         const char * server_config = "--SERVER=127.0.0.1";
10         memcached_st * cache_client = NULL;
11         cout << static_cast<const void *>(cache_client) << endl;
12         cache_client = memcached(server_config, strlen(server_config));
13         cout << static_cast<const void *>(cache_client) << endl;
14         memcached_free(cache_client);
15         cout << static_cast<const void *>(cache_client) << endl;
16         return 0;
17 }

コンパイルを実行します。

g++ memcached_connection_test.cpp -o memcached_connection_test.exe            
/tmp/ccf2s5UM.o: In function `main':
memcached_connection_test.cpp:(.text+0x2d): `memcached'に対する定義されていない参照
memcached_connection_test.cpp:(.text+0x3d): `memcached_free'に対する定義されていない参照
collect2: error: ldは1の終了ステータスを返しました

ここでエラーが発生しました。これは動的ライブラリがリンクされていないため、最終的なリンクに失敗したためです。

g++ memcached_connection_test.cpp -lmemcached -o memcached_connection_test.exe

コンパイルが成功しました。./memcached_connection_test.exeを実行します。

root@iZwz9aujzgp9b5o38x29akZ:~/memcached_cpp# ./memcached_connection_test.exe 
0
0x557ca3ff3280
0x557ca3ff3280

memcached()がメモリを割り当てたことを示しています。接続が成功したことを確認するために、memcacheからデータを取得してみましょう。

 1 #include <iostream>
 2 
 3 #include <string.h>
 4 #include <libmemcached/memcached.h>
 5 
 6 using namespace std;
 7 
 8 int main()
 9 {
10         const char * server_config = "--SERVER=127.0.0.1";
11         memcached_st * cache_client = memcached(server_config, strlen(server_config)); 
12         memcached_return_t result;
13         const char * data_key = "username";
14         size_t data_length;
15         uint32_t data_flags;
16         char * data_value = memcached_get(cache_client, data_key, strlen(data_key), &data_length, &data_flags, &result);
17         cout << "キー:" << data_key << endl;
18         cout << "結果:" << result << endl;
19 
20         if(memcached_success(result))
21         {
22                 cout << "値:" << data_value << endl;
23                 cout << "値の長さ:" << data_length << endl;
24                 cout << "フラグ:" << data_flags << endl;
25         }
26         else
27         {
28                 cout << "memcached_get失敗" << endl;
29         }
30 
31         memcached_free(cache_client);
32         return 0;
33 }
root@iZwz9aujzgp9b5o38x29akZ:~/memcached_cpp# g++ memcached_connection_test.cpp -lmemcached -o memcached_connection_test.exe
root@iZwz9aujzgp9b5o38x29akZ:~/memcached_cpp# ./memcached_connection_test.exe 
キー:username
結果:0
値:john_doe
値の長さ:8
フラグ:0<br></br>

タグ: memcached C++ libmemcached キャッシュ

6月25日 23:50 投稿