691
人物
C__客戶端連接實例_快速入門_雲數據庫 Memcache 版-阿裏雲
客戶端下載
環境配置
下載編譯安裝 C++ 客戶端。
https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
執行以下命令。
tar -xvf libmemcached-1.0.18.tar.gzcd libmemcached-1.0.18./configuremakemake install (可能需要sudo權限)
C++代碼示例
下載 ocs_test.tar.gz。
執行以下命令。
tar -xvf ocs_test.tar.gzcd ocs_testvim ocs_test_sample1.cpp
修改 TARGET_HOST 為購買到的 Memcache 地址, USERNAME 為購買到的用戶名, PASSWORD 為設置好的密碼。
執行
build.sh生成 ocs_test。運行./ocs_test即可看到寫入一個 key 到 Memcache 中,再從 Memcache 獲取到,最後將這個 key 從 Memcache 中刪除。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_client_init(NULL);rc = memcached_set_sasl_auth_data(memc, USERNAME, PASSWORD);if(rc != MEMCACHED_SUCCESS) {cout<<"Set SASL err:"<< endl;}rc = memcached_behavior_set(memc,MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,1);if(rc != MEMCACHED_SUCCESS) {cout<<"Binary Set err:"<<endl;}/* SASL */rc = memcached_server_push(memc,server);if(rc != MEMCACHED_SUCCESS) {cout <<"Connect Mem err:"<< rc << endl;}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 datarc = 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 datacout << "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;//freememcached_free(memc);return 0;}
下麵是另一個 C++程序使用 Memcache 實例,在這裏我們可以看見 Memcache 緩存與 MySQL 數據庫相結合的場景。編譯安裝 C++客戶端的步驟還是與上一個例子相同。
在 MySQL 數據庫中創建示例 database 和 table。
mysql -h host -uUSER -pPASSSWORDcreate database 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) );
下載 ocs_test_2.tar.gz,並執行以下命令。
tar -xvf ocs_test_2.tar.gzcd ocs_testvim ocs_test_sample2.cpp
注意:修改 OCS_TARGET_HOST 為購買到的 Memcache 地址, OCS_USERNAME 為 Memcache 的實例名, 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_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;return EXIT_FAILURE;}cout << "connect mysql success!" << endl;return 0;}bool InitMemcached(){memcached_server_st *server;memc = memcached_create(NULL);server = memcached_server_list_append(NULL, OCS_TARGET_HOST, 11211,&rc);/* 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;return false;}rc = memcached_behavior_set(memc,MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,1);if (rc != MEMCACHED_SUCCESS){cout<<"Binary Set err:"<<endl;return false;}/* SASL */rc = memcached_server_push(memc,server);if (rc != MEMCACHED_SUCCESS){cout <<"Connect Mem err:"<< rc << endl;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 datarc = 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 cachestring 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;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;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;}bool SaveMysql(UserInfo *user_info){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 mysqlreturn true;}int main(int argc, char *argv[]){if (InitMysql() != 0){return -1;}if (!InitMemcached()){return -1;}//generate user_infoUserInfo 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 mysqlif (!SaveMysql(&user_info)){//return -1;}string user_str;user_str.assign((char*)&user_info, sizeof(UserInfo));//save to memcachedstring key_str = TEST_USER_ID;SaveToCache(key_str, user_str, 10);//start get, exist in memcahcedUserInfo *get_user_info = GetUserInfo(user_info.user_id);PrintUserInfo(get_user_info);//wait 10 seconssleep(2);//delete memcached or expiredDeleteCache(key_str, 0);//start get, exist in mysqldelete get_user_info;get_user_info = GetUserInfo(user_info.user_id);PrintUserInfo(get_user_info);delete get_user_info;//freememcached_free(memc);mysql_close(mysql);return 0;}
最後更新:2016-12-19 14:22:42
上一篇:
C#/.NET: EnyimMemcached__客戶端連接實例_快速入門_雲數據庫 Memcache 版-阿裏雲
下一篇:
公網連接實例__快速入門_雲數據庫 Memcache 版-阿裏雲
使用 mysqldump 遷移 MySQL 數據__遷移數據_快速入門(MySQL)_雲數據庫 RDS 版-阿裏雲
規格說明__購買指南_雲數據庫 Redis 版-阿裏雲
OSS錯誤響應__API 參考_對象存儲 OSS-阿裏雲
阿裏雲手機係統能否挑戰安卓和蘋果操作係統?
解綁別名__alias相關_API 列表_OpenAPI 2.0_移動推送-阿裏雲
購買實例__購買指導_移動安全-阿裏雲
查看同步性能__實時同步_用戶指南_數據傳輸-阿裏雲
創建集群實例__集群API列表_API參考_容器服務-阿裏雲
雲數據庫Redis版監控__雲服務監控_用戶指南_雲監控-阿裏雲
示例__.Net SDK_RAM SDK使用手冊_訪問控製-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲