すべてのプロダクト
Search
ドキュメントセンター

:C++

最終更新日:Apr 02, 2025

クライアントのダウンロード

ダウンロード アドレス

クライアントについて

クライアント バージョン

環境の設定

  1. C++ クライアントをダウンロード、コンパイル、およびインストールします。

    https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz

  2. 次のコマンドを実行します。

     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++ サンプルコード

  1. ocs_test.tar.gz をダウンロードします。

  2. 次のコマンドを実行します。

    tar -xvf ocs_test.tar.gz 
    cd ocs_test 
    vim ocs_test_sample1.cpp
  3. TARGET_HOST の値を作成した ApsaraDB for Memcache インスタンスのアドレスに、USERNAME の値をインスタンスの作成に使用したユーザー名に、PASSWORD の値を必要なパスワードに変更します。

  4. 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++ クライアントのコンパイルとインストール方法の詳細については、前の手順を参照してください。

  1. 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 を作成 */
  2. 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 はデータベースのパスワードを示します。

  3. 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;
     }