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.gz
cd libmemcached-1.0.18
./configure
make
make install (可能需要sudo權限)
C++代碼示例
下載 ocs_test.tar.gz。
執行以下命令。
tar -xvf ocs_test.tar.gz
cd ocs_test
vim 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 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++程序使用 Memcache 實例,在這裏我們可以看見 Memcache 緩存與 MySQL 數據庫相結合的場景。編譯安裝 C++客戶端的步驟還是與上一個例子相同。
在 MySQL 數據庫中創建示例 database 和 table。
mysql -h host -uUSER -pPASSSWORD
create 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.gz
cd ocs_test
vim 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 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;
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 mysql
return true;
}
int main(int argc, char *argv[])
{
if (InitMysql() != 0)
{
return -1;
}
if (!InitMemcached())
{
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
if (!SaveMysql(&user_info))
{
//return -1;
}
string user_str;
user_str.assign((char*)&user_info, sizeof(UserInfo));
//save to memcached
string key_str = TEST_USER_ID;
SaveToCache(key_str, user_str, 10);
//start get, exist in memcahced
UserInfo *get_user_info = GetUserInfo(user_info.user_id);
PrintUserInfo(get_user_info);
//wait 10 secons
sleep(2);
//delete memcached or expired
DeleteCache(key_str, 0);
//start get, exist in 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;
}
最後更新: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-阿裏雲