memcache和redis一样,属于内存数据库。
http报文到达工作线程,由memcache的libevent机制,把报文放到消息队列,然后通过http协议,比如libcurl解析,得到报文请求数据部分,根据请求访问memcached服务器(即调用memcached API),访问数据库。
使用libmemcached库
target_link_libraries(test memcached)
例子
#include<libmemcached/memcached.h>
int main()
{
//后端建立对memcached的连接(127.0.0.1表示memcached在本主机上,不需要经过网络传播)
memcached_st *memc;
memcached_return rc;
memcached_server_st *server;
time_t expiration;
uint32_t flags;
memc = memcached_create(NULL);
server = memcached_server_list_append(NULL,"localhost",11211,&rc);//向list中添加所有需要连接的服务器
//servers= memcached_servers_parse("127.0.0.1:12300");
rc=memcached_server_push(memc,server);//把list中的信息导入memc,并创建与list中所有服务器的连接
memcached_server_list_free(server);//销毁list
//memcached_server_free(servers);
string key = "key";
string value = "value";
size_t value_length = value.length();
size_t key_length = key.length();
//增、改
//memcached中如果存在该键,则利用新值去替换,否则将该记录写入memcached中。
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
if(rc==MEMCACHED_SUCCESS)
{
cout<<"Save data:"<<value<<" sucessful!"<<endl;
}
//增
rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
if(rc==MEMCACHED_SUCCESS)
{
cout<<"Save data:"<<value<<" sucessful!"<<endl;
}
//改
//如果memcached中存在该键,发生错误;否则将该记录添加进memcached中
rc = memcached_replace(memc,key.c_str(),key.length(),value.c_str(),value.length(), expiration,flags);
if(rc==MEMCACHED_SUCCESS)
{
cout<<"modify data:"<<value<<" sucessful!"<<endl;
}
//查
char* result = memcached_get(memc,key.c_str(),key_length,&value_length,&flags,&rc);
if(rc == MEMCACHED_SUCCESS)
{
cout<<"Get value:"<<result<<" sucessful!"<<endl;
}
//删
rc=memcached_delete(memc,key.c_str(),key_length,expiration);
if(rc==MEMCACHED_SUCCESS)
{
cout<<"Delete key:"<<key<<" sucessful!"<<endl;
}
// 给服务器发送flush_all命令
ret = memcached_flush(memc, 0);
if (ret != MEMCACHED_SUCCESS) {
cout << "memcached_flush failed." << endl;
return 1;
}
//断开连接
memcached_quit (memcached_st *ptr);
memcached_free(memc);
return 0;
}
设置memcached属性
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
memcached_behavior_set(memc,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 20) ;
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS, 1) ;
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 5) ;
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS, true) ;
/*
memcached属性,memcached_behavior_set()用于设定这些属性的值
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
MEMCACHED_BEHAVIOR_DISTRIBUTION
MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
*/