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-阿里云