封裝 libmemcached

原帖:http://www.cnblogs.com/tianyajuanke/archive/2012/04/26/2471859.html


對 libmemcached進行二次封裝,主要是利用其存儲 vector<T>。

下面有待改善和完善,先記着,下次更新。

#include <iostream>
#include <string>
#include <libmemcached/memcached.h>
#include <vector>

using namespace std;

class MemcachedHelper
{
    time_t expiration;
    uint32_t  flags;
    memcached_st *memc;
      memcached_return rc;
      memcached_server_st *server;
  public:
    MemcachedHelper()
    {
        memc = memcached_create(NULL);
        server = memcached_server_list_append(NULL,"10.10.10.233",11211,&rc);
        rc=memcached_server_push(memc,server);
        memcached_server_list_free(server);
        expiration = 100;
    }
    ~MemcachedHelper()
    {
        memcached_free(memc);
    }
    public:
    template<class T> void set(string in_key,vector<T> in_vect)
    {
        char* valueChar = new char[sizeof(T)* in_vect.size()];
        memcpy(valueChar, &in_vect[0], sizeof(T)* in_vect.size());
        size_t value_length = sizeof(T)* in_vect.size();    
        rc=memcached_set(memc,in_key.c_str(),in_key.length(),valueChar,value_length,expiration,flags);
        if(rc==MEMCACHED_SUCCESS)
        {
            cout<<"Set: "<<in_key<<" OK!"<<endl;
        }
        delete valueChar;
    }
    public:    
    template<class T> void get(string in_key,vector<T>& in_vect)
    {    
        size_t value_length = 0;
        size_t key_length = in_key.length();
        char* result = memcached_get(memc,in_key.c_str(), key_length,&value_length,&flags,&rc);
        if(rc == MEMCACHED_SUCCESS)
        {
            in_vect.reserve(value_length / (sizeof(T)));
            memcpy(&in_vect[0], result, value_length);
            cout<<"Get: "<<in_key<<" OK!"<<endl;
        }
    }    
};


class Product
{
public:
    Product(){}
    Product(int in_id, int in_price)
    {
        id = in_id;
        price = in_price;
    }

public:
    int id;
    int price;
public:
    int getid(){return id;}
    int getprice(){return price;}
};


int main()
{
    Product product1(1,1);
    Product product2(2,2);
    Product product3(30,30);
    vector<Product> product;
    product.push_back(product1);
    product.push_back(product2);
    product.push_back(product3);

    MemcachedHelper mem;

    mem.set("oo",product);
    
    vector<Product> result;
    mem.get("oo",result);
    cout<<result[2].id<<endl;
}


改進版(仍有待改進):


#include <iostream>
#include <string>
#include <libmemcached/memcached.h>
#include <vector>

#pragma once

using namespace std;


class MemcachedHelper
{
    time_t expiration;
    uint32_t  flags;
    memcached_st *memc;
      memcached_return rc;
      memcached_server_st *server;
  public:
    MemcachedHelper()
    {
        memc = memcached_create(NULL);
        server = memcached_server_list_append(NULL,"10.10.10.233",11211,&rc);
        rc=memcached_server_push(memc,server);
        memcached_server_list_free(server);
        expiration = 1000000;
    }
    ~MemcachedHelper()
    {
        memcached_free(memc);
    }
    
    public:
    int set(string in_key,string in_value)
    {
        rc=memcached_set(memc,in_key.c_str(),in_key.length(),in_value.c_str(),in_value.length(),expiration,flags);
        if(rc==MEMCACHED_SUCCESS)
            return 1;
        else
            return 0;
    }
    
    public:
    template<class T> int set(string in_key,vector<T> &in_vect)
    {
        char* valueChar = new char[sizeof(T)* in_vect.size()];
        memcpy(valueChar, &in_vect[0], sizeof(T)* in_vect.size());
        size_t value_length = sizeof(T)* in_vect.size();    
        rc=memcached_set(memc,in_key.c_str(),in_key.length(),valueChar,value_length,expiration,flags);
        if(rc==MEMCACHED_SUCCESS)
            return 1;
        else
            return 0;
        delete valueChar;
    }
    
    public:    
    int get(string in_key,string &out_value)
    {    
        size_t value_length = 0;
        char* result = memcached_get(memc,in_key.c_str(), in_key.length(),&value_length,&flags,&rc);
        if(rc == MEMCACHED_SUCCESS)
        {
            out_value = result;
            return 1;
        }
        else
        {
            return 0;
        }
    }    
    
    public:    
    template<class T> int get(string in_key,vector<T>& in_vect)
    {    
        size_t value_length = 0;
        size_t key_length = in_key.length();
        char* result = memcached_get(memc,in_key.c_str(), key_length,&value_length,&flags,&rc);
        if(rc == MEMCACHED_SUCCESS)
        {
            in_vect.reserve(value_length / (sizeof(T)));
            memcpy(&in_vect[0], result, value_length);
            in_vect.assign(in_vect.begin(),in_vect.begin()+value_length/(sizeof(T)));
            //cout<<"Get: "<<in_key<<" OK!"<<endl;
            //size = value_length/sizeof(T);
            return 1;
        }
        else
        {
            return 0;
        }
    }    
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章