利用MysqlUDF编写Memcached扩展函数
来源:互联网 发布:qq变声软件下载 编辑:程序博客网 时间:2024/06/07 19:23
一、安装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
阅读全文