クライアントのダウンロード
環境の設定
C++ クライアントをダウンロード、コンパイル、およびインストールします。
https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
次のコマンドを実行します。
tar -xvf libmemcached-1.0.18.tar.gz cd libmemcached-1.0.18 ./configure --enable-sasl make make install (sudo permission may be required) /* sudo 権限が必要になる場合があります */
C++ サンプルコード
ocs_test.tar.gz をダウンロードします。
次のコマンドを実行します。
tar -xvf ocs_test.tar.gz cd ocs_test vim ocs_test_sample1.cppTARGET_HOST の値を作成した ApsaraDB for Memcache インスタンスのアドレスに、USERNAME の値をインスタンスの作成に使用したユーザー名に、PASSWORD の値を必要なパスワードに変更します。
build.shを実行して ocs_test を生成します。./ocs_testを実行して、インスタンスとの間でキーを書き込みおよび取得します。 その後、インスタンスからキーを削除できます。ocs_test_sample1.cpp サンプルコード
#include <iostream> #include <string> #include <libmemcached/memcached.h> using namespace std; #define TARGET_HOST "" #define USERNAME "" #define PASSWORD "" int main(int argc, char *argv[]) { memcached_st *memc = NULL; memcached_return rc; memcached_server_st *server; memc = memcached_create(NULL); server = memcached_server_list_append(NULL, TARGET_HOST, 11211,&rc); /* SASL */ /* SASL */ sasl_client_init(NULL); rc = memcached_set_sasl_auth_data(memc, USERNAME, PASSWORD); if(rc != MEMCACHED_SUCCESS) { cout<<"Set SASL err:"<< endl; /* SASL 設定エラー */ } rc = memcached_behavior_set(memc,MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,1); if(rc != MEMCACHED_SUCCESS) { cout<<"Binary Set err:"<<endl; /* バイナリ設定エラー */ } /* SASL */ /* SASL */ rc = memcached_server_push(memc,server); if(rc != MEMCACHED_SUCCESS) { cout <<"Connect Mem err:"<< rc << endl; /* Memcached 接続エラー */ } memcached_server_list_free(server); string key = "TestKey"; string value = "TestValue"; size_t value_length = value.length(); size_t key_length = key.length(); int expiration = 0; uint32_t flags = 0; //Save data // データの保存 rc = memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags); if (rc != MEMCACHED_SUCCESS){ cout <<"Save data failed: " << rc << endl; /* データの保存に失敗しました */ return -1; } cout <<"Save data succeed, key: " << key << " value: " << value << endl; /* データの保存に成功しました。キー: 値: */ cout << "Start get key:" << key << endl; /* キーの取得を開始します: */ char* result = memcached_get(memc,key.c_str(),key_length,&value_length,&flags,&rc); cout << "Get value:" << result << endl; /* 値の取得: */ //Delete data // データの削除 cout << "Start delete key:" << key << endl; /* キーの削除を開始します: */ rc = memcached_delete(memc,key.c_str(),key_length,expiration); if (rc != MEMCACHED_SUCCESS) { cout << "Delete key failed: " << rc << endl; /* キーの削除に失敗しました */ } cout << "Delete key succeed: " << rc << endl; /* キーの削除に成功しました */ //free // 解放 memcached_free(memc); return 0; }
以下の情報は、別の C++ プログラムで ApsaraDB for Memcache を使用するためのコード例を提供します。 ApsaraDB for Memcache のキャッシュは MySQL データベースと共に使用されます。 C++ クライアントのコンパイルとインストール方法の詳細については、前の手順を参照してください。
MySQL データベースにサンプルデータベースとテーブルを作成します。
mysql -h host -uUSER -pPASSSWORD /* mysql -h ホスト -uユーザー -pパスワード */ create database testdb; /* データベース testdb を作成 */ create table user_info (user_id int, user_name char(32) not null, password char(32) not null, is_online int, primary key(user_id) ); /* テーブル user_info を作成 */ocs_test_2.tar.gz をダウンロードし、次のコマンドを実行します。
tar -xvf ocs_test_2.tar.gz cd ocs_test vim ocs_test_sample2.cpp説明OCS_TARGET_HOST の値を作成した ApsaraDB for Memcache インスタンスのアドレスに、OCS_USERNAME の値をインスタンスの作成に使用したユーザー名に、OCS_PASSWORD の値を必要なパスワードに変更します。 MYSQL_HOST は MySQL データベースのアドレスを示し、MYSQL_USERNAME はデータベースのユーザー名を示し、MYSQL_PASSWORD はデータベースのパスワードを示します。
build.shを実行して ocs_test を生成し、/ocs_testを実行します。ocs_test_sample2.cpp サンプルコード
#include <iostream> #include <string> #include <sstream> #include <libmemcached/memcached.h> #include <mysql/mysql.h> using namespace std; #define OCS_TARGET_HOST "xxxxxxxxxx.m.yyyyyyyyy.ocs.aliyuncs.com" #define OCS_USERNAME "your_user_name" #define OCS_PASSWORD "your_password" #define MYSQL_HOST "zzzzzzzzzz.mysql.rds.aliyuncs.com" #define MYSQL_USERNAME "db_user" #define MYSQL_PASSWORD "db_paswd" #define MYSQL_DBNAME "testdb" #define TEST_USER_ID "100" MYSQL *mysql = NULL; memcached_st *memc = NULL; memcached_return rc; int InitMysql() /* MySQL の初期化 */ { mysql = mysql_init(0); if (mysql_real_connect(mysql, MYSQL_HOST, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT, NULL, CLIENT_FOUND_ROWS) == NULL ) { cout << "connect mysql failure!" << endl; /* MySQL への接続に失敗しました */ return EXIT_FAILURE; } cout << "connect mysql success!" << endl; /* MySQL への接続に成功しました */ return 0; } bool InitMemcached() /* Memcached の初期化 */ { memcached_server_st *server; memc = memcached_create(NULL); server = memcached_server_list_append(NULL, OCS_TARGET_HOST, 11211,&rc); /* SASL */ /* SASL */ sasl_client_init(NULL); rc = memcached_set_sasl_auth_data(memc, OCS_USERNAME, OCS_PASSWORD); if (rc != MEMCACHED_SUCCESS) { cout<<"Set SASL err:"<< endl; /* SASL 設定エラー */ return false; } rc = memcached_behavior_set(memc,MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,1); if (rc != MEMCACHED_SUCCESS) { cout<<"Binary Set err:"<<endl; /* バイナリ設定エラー */ return false; } /* SASL */ /* SASL */ rc = memcached_server_push(memc,server); if (rc != MEMCACHED_SUCCESS) { cout <<"Connect Mem err:"<< rc << endl; /* Memcached 接続エラー */ return false; } memcached_server_list_free(server); return true; } struct UserInfo /* ユーザー情報 */ { int user_id; char user_name[32]; char password[32]; int is_online; }; bool SaveToCache(string &key, string &value, int expiration) /* キャッシュに保存 */ { size_t value_length = value.length(); size_t key_length = key.length(); uint32_t flags = 0; //Save data // データの保存 rc = memcached_set( memc,key.c_str(), key.length(), value.c_str(), value.length(), expiration, flags); if (rc != MEMCACHED_SUCCESS){ cout <<"Save data to cache failed: " << rc << endl; /* キャッシュへのデータの保存に失敗しました */ return false; } cout <<"Save data to cache succeed, key: " << key << " value: " << value << endl; /* キャッシュへのデータの保存に成功しました。キー: 値: */ return true; } UserInfo *GetUserInfo(int user_id) /* ユーザー情報の取得 */ { UserInfo *user_info = NULL; //get from cache // キャッシュから取得 string key; stringstream out; out << user_id; key = out.str(); cout << "Start get key:" << key << endl; /* キーの取得を開始します: */ size_t value_length; uint32_t flags; char* result = memcached_get(memc, key.c_str(), key.size(), &value_length, &flags, &rc); if (rc != MEMCACHED_SUCCESS) { cout << "Get Cache Failed, start get from mysql."<< endl; /* キャッシュの取得に失敗しました。MySQL からの取得を開始します。 */ int status; char select_sql[1024]; memset(select_sql, 0x0, sizeof(select_sql)); sprintf(select_sql, "select * from user_info where user_id = %d", user_id); status = mysql_query(mysql, select_sql); if (status !=0 ) { cout << "query from mysql failure!" << endl; /* MySQL からのクエリに失敗しました */ return NULL; } cout << "the status is :" << status << endl; /* ステータスは次のとおりです: */ MYSQL_RES *mysql_result = mysql_store_result(mysql); user_info = new UserInfo; MYSQL_ROW row; while (row = mysql_fetch_row(mysql_result)) { user_info->user_id = atoi(row[0]); strncpy(user_info->user_name, row[1], strlen(row[1])); strncpy(user_info->password, row[2], strlen(row[2])); user_info->is_online = atoi(row[3]); } mysql_free_result(mysql_result); return user_info; } cout << "Get from cache succeed" << endl; /* キャッシュからの取得に成功しました */ user_info = new UserInfo; memcpy(user_info, result, value_length); return user_info; } bool DeleteCache(string &key, int expiration) /* キャッシュの削除 */ { rc = memcached_delete(memc, key.c_str(), key.length(), expiration); if (rc != MEMCACHED_SUCCESS) { cout << "Delete key failed: " << rc << endl; /* キーの削除に失敗しました */ return false; } cout << "Delete key succeed: " << rc << endl; /* キーの削除に成功しました */ return true; } void PrintUserInfo(UserInfo *user_info) /* ユーザー情報の出力 */ { cout << "user_id: " << user_info->user_id << " " << " name: " << user_info->user_name << endl; /* ユーザー ID: 名前: */ } bool SaveMysql(UserInfo *user_info) /* MySQL に保存 */ { char insert_sql[1024]; memset(insert_sql, 0x0, sizeof(insert_sql)); sprintf(insert_sql, "insert into user_info(user_id, user_name, password, is_online) values(%d, '%s', '%s', %d)", user_info->user_id, user_info->user_name, user_info->password, user_info->is_online); int status = mysql_query(mysql, insert_sql); if (status != 0) { cout << "insert failed" << endl; /* 挿入に失敗しました */ return false; } cout << "insert user_info" << endl; /* ユーザー情報を挿入 */ //insert mysql // MySQL に挿入 return true; } int main(int argc, char *argv[]) { if (InitMysql() != 0) /* MySQL の初期化 */ { return -1; } if (!InitMemcached()) /* Memcached の初期化 */ { return -1; } //generate user_info // ユーザー情報の生成 UserInfo user_info; user_info.user_id = atoi(TEST_USER_ID); strcpy(user_info.user_name, "James"); strcpy(user_info.password, "12345678"); user_info.is_online = 1; //save to mysql // MySQL に保存 if (!SaveMysql(&user_info)) { //return -1; } string user_str; user_str.assign((char*)&user_info, sizeof(UserInfo)); //save to memcached // Memcached に保存 string key_str = TEST_USER_ID; SaveToCache(key_str, user_str, 10); //start get, exist in memcahced // 取得開始、Memcached に存在する UserInfo *get_user_info = GetUserInfo(user_info.user_id); PrintUserInfo(get_user_info); //wait 10 secons // 10 秒待機 sleep(2); //delete memcached or expired // Memcached を削除または期限切れにする DeleteCache(key_str, 0); //start get, exist in mysql // 取得開始、MySQL に存在する delete get_user_info; get_user_info = GetUserInfo(user_info.user_id); PrintUserInfo(get_user_info); delete get_user_info; //free // 解放 memcached_free(memc); mysql_close(mysql); return 0; }