利用MysqlUDF编写Memcached扩展函数

一、安装Memcached和客户端库LibMemcached

Memcached下载地址:http://memcached.org
LibMemcached下载地址:http://libmemcached.org
(官网有安装方法,略)

二、用C/C++封装方法(如 set方法 和 get方法)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include "mysql.h"
#include <libmemcached/memcached.h>

using namespace std;
const char *memServer="127.0.0.1";
int memcPort=11211;

extern "C" long long memc_set(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)  
{  

      memcached_server_st *servers = NULL;
      memcached_st *memc;
      memcached_return rc;

     char *keyField = (char *)args->args[0]; //cache key add by shenyi
     char *valueField =(char *)args->args[1]; //cache value  add by shenyi
     int timeField=atoi(args->args[2]); //cache time add by shenyi

     memcached_server_st *memcached_servers_parse (char *server_strings);
     memc= memcached_create(NULL);

     servers= memcached_server_list_append(servers, memServer, memcPort, &rc);
     rc= memcached_server_push(memc, servers);
     if (rc != MEMCACHED_SUCCESS)
    {
        strcpy(error,"Couldn't add server");  
        memcached_free(memc);
        return 0;
    }

     //this is libmemcached set function and params  add by shenyi
     rc= memcached_set(memc, keyField, strlen(keyField), valueField, strlen(valueField), (time_t)timeField, (uint32_t)0);

     if (rc != MEMCACHED_SUCCESS)
     {
         strcpy(error,"Couldn't set value");  
         memcached_server_list_free(servers);
         memcached_free(memc);
        return 0;
     }

      memcached_server_list_free(servers);
      memcached_free(memc);

     return 1;
}  

extern "C" my_bool memc_set_init(UDF_INIT *initid, UDF_ARGS *args, char *message)  
{  
    if(args->arg_count!=3){
        strcpy(
            message
        ,   "Memc_set expected exactly three arguments,like key value time"
        );      // error msg add by shenyi
        return 1;
    }
    return 0;
}  


extern "C" char *memc_get(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)  
{  
      memcached_server_st *servers = NULL;
      memcached_st *memc;
      memcached_return rc;

      size_t return_key_length;
      size_t return_value_length;
      char *return_value;
       uint32_t flags = 0;
     const  char *keyField = (const char *)args->args[0]; //cache key add by shenyi

     memcached_server_st *memcached_servers_parse (char *server_strings);
     memc= memcached_create(NULL);

     servers= memcached_server_list_append(servers, memServer, memcPort, &rc);
     rc= memcached_server_push(memc, servers);

     //this is libmemcached get function and params  add by shenyi
     return_value= memcached_get(memc, keyField,strlen(keyField), &return_value_length,&flags,&rc);
    if (rc != MEMCACHED_SUCCESS || return_value==NULL )  //get null value or error add by shenyi
     { 
         memcached_server_list_free(servers);
         memcached_free(memc);
         return NULL;
     }

      memcached_server_list_free(servers);
      memcached_free(memc);

     return return_value;
}  

extern "C" my_bool memc_get_init(UDF_INIT *initid, UDF_ARGS *args, char *message)  
{  
    if(args->arg_count!=1){
        strcpy(
            message
        ,   "Memc_get expected exactly ono arguments,like memc_get(xx)"
        );      // error msg add by shenyi
        return 1;
    }
    return 0;
}  

三、编译

g++ -I /usr/include/mysql/ -L /usr/local/lib/ -l memcached -shared -fPIC -o mysql-memc.so mysql-memc.cpp --std=c++0x

四、部署插件

cp mysql-memc.so /usr/lib/mysql/plugin/

五、在 Mysql 中创建函数

CREATE FUNCTION memc_set RETURNS INTEGER SONAME 'mysql-memc.so';
CREATE FUNCTION memc_get RETURNS STRING SONAME 'mysql-memc.so';

六、Mysql 操作 Memcached

select memc_set('name','jack','60');
select memc_get('name');

#可能遇到的问题

和用UDF编写Redis扩展函数的问题一样,解决方法:
http://blog.csdn.net/txl13109187932/article/details/78885954

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值