一、安装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