封装 libmemcached 构建 memcached 客户端

来源:互联网 发布:淘宝怎么使用不了花呗 编辑:程序博客网 时间:2024/05/16 15:25

代码如下:

1、构建服务器连接

MemcachedClient::MemcachedClient(const char *opt_servers) {        mc = memcached_create(NULL);        if(mc == NULL) {                cout << "Error: memcached_create fail " << endl;                exit(-1);        }        memcached_server_st *servers =memcached_servers_parse(opt_servers);        memcached_return_t ret = memcached_server_push(mc,servers);        memcached_server_list_free(servers);        if(ret != MEMCACHED_SUCCESS) {                cout << "Error: memcached_server_list_append fail " << memcached_strerror(mc,ret)       << endl;                exit(-1);        }        if(ret != MEMCACHED_SUCCESS) {                cout << "Error: memcached_server_push fail "<< memcached_strerror(mc,ret)<< endl;                exit(-1);        }}

其中opt_servers格式为host1:port1,host2:port2......

该方法会构建一个客户端memcached_st *mc;与服务器列表建立连接,在操作memcached服务器时,客户端会根据key值来找到合适的服务器

2、写入数据


int MemcachedClient::put(const string &key,const string &value,long timeout) {        memcached_return_t ret;        ret = memcached_set(mc,key.c_str(),key.length(),value.c_str(),value.length(),timeout,0);        if(ret == MEMCACHED_SUCCESS){                return 0;        }        else {                cout << "Error: set key fail "                << memcached_strerror(mc,ret)                << endl;                return 1;        }}

3、获取数据


pair<int,string> MemcachedClient::get(const string &key) {        memcached_return_t ret;        size_t len ;        string value;        unsigned int flag;        char *result = memcached_get(mc,key.c_str(),key.length(),&len,&flag,&ret);           if(ret == MEMCACHED_SUCCESS){                value = string(result);                free(result);                return make_pair<int,string>(1,value);        }        else if(ret == MEMCACHED_NOTFOUND){                cout << " No value is fetched!" << endl;                return make_pair<int,string>(0,value);        }        else {                cout << "Error: get key fail" << memcached_strerror(mc,ret) << endl;                return make_pair<int,string>(-1,value);        }}

4、获取一组数据

vector<string> MemcachedClient::mget(const char *keys[], int keys_array_len){        vector<string> result;        int i = 0;        size_t key_len_array[keys_array_len];        for(i=0; i < keys_array_len ; i++){                key_len_array[i]=strlen(keys[i]);        }        char return_key[MEMCACHED_MAX_KEY];        char *return_value;        size_t return_value_length;        size_t return_key_length;        uint32_t flags;        memcached_return_t rc = memcached_mget(mc,keys,key_len_array,keys_array_len);        while((return_value=memcached_fetch(mc,return_key,&return_key_length,&return_value_length,&flags,&rc))){                if(rc==MEMCACHED_SUCCESS){                        result.push_back(return_value);                }else{                        cout << "ret num is : " << rc << endl;                }        }        return result;}

5、删除数据

int MemcachedClient::delete(const string &key) {        memcached_return_t ret;        ret = memcached_delete(mc,key.c_str(),key.length(),0);        if(ret == MEMCACHED_SUCCESS)                return 0;        else {                cout << "Error: set key fail "<< memcached_strerror(mc,ret)<< endl;                return 1;        }}

6、析构函数

MemcachedClient::~MemcachedClient() {        memcached_free(this->mc);}

测试:

int main(int arc, char* argv[]){        //string key="firstData";        const char * keys[] = {"firstData","key1","key2"};        //const char * keys[] = {"Firstkey"};        const int keys_array_length = sizeof(keys)/sizeof(keys[0]);        MemcachedClient firstcache(argv[1]);        int i = 0;        for(i=0;i<keys_array_length;i++){                firstcache.Set(keys[i],"this is a %d test!",180);        }        pair<int,string> result = firstcache.Get(keys[0]);        vector<string> result1 ;        result1 = firstcache.mget(keys,keys_array_length);        for(vector<string>::size_type ix =0; ix != result1.size(); ++ix){                cout << " mget :::" <<result1[ix] << endl;        }}


安装libevent

安装memcached

执行memcached -u root -p 11211 -m 2048m -d

出现:

memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

通过命令

LD_DEBUG=libs /usr/local/bin/memcached -v
7022:     find library=libevent-2.0.so.5 [0]; searching
7022:      search cache=/etc/ld.so.cache
7022:      search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64               (system search path)
7022:       trying file=/lib64/tls/x86_64/libevent-2.0.so.5
7022:       trying file=/lib64/tls/libevent-2.0.so.5
7022:       trying file=/lib64/x86_64/libevent-2.0.so.5
7022:       trying file=/lib64/libevent-2.0.so.5
7022:       trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5
7022:       trying file=/usr/lib64/tls/libevent-2.0.so.5
7022:       trying file=/usr/lib64/x86_64/libevent-2.0.so.5
7022:       trying file=/usr/lib64/libevent-2.0.so.5
7022:
/usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

 
则建立链接

ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
 

安装libmemcached,目前版本为1.0.4

install libmemcached

./configuration

make

make test

make install

 

g++ -o test test.cpp  -L/usr/local/lib -lmemcached

如果命令失败,则执行

sudo ln -s  /usr/local/lib/libmemcached.so.9 /usr/lib64/libmemcached.so.9
 


原创粉丝点击