使用时需要把redisclient.h、anet.h、fmacros.h、anet.c 这4个文件考到目录下,开始编写关于Redis的UDF。我们定义了redis_hset作为主函数,连接Redis并调用hset插入哈希表,redis_hset_init作为初始化,检查参数个数和类型。
#include <stdio.h> 3 #include <mysql.h> boost; std; redis::client *m_client = NULL; *redis_hset(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error) { 11 try { (NULL == m_client) { * c_host = getenv(); ; 16 if(c_host) { 17 host = c_host; 18 } 19 m_client = new redis::client(host); 20 } (!(args->args && args->args[0] && args->args[1] && args->args[2])) { 23 *is_null = 1; 24 return result; 25 } (m_client->hset(args->args[0], args->args[1], args->args[2])) { 29 return result; 30 } else { 31 *error = 1; 32 return result; 33 } 34 } catch (const redis::redis_error& e) { 35 return result; 36 } 37 } my_bool redis_hset_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { 40 if (3 != args->arg_count) { strncpy(message, , MYSQL_ERRMSG_SIZE); 43 return -1; 44 } 45 if (args->arg_type[0] != STRING_RESULT || 46 args->arg_type[1] != STRING_RESULT || 47 args->arg_type[2] != STRING_RESULT) { strncpy(message, , MYSQL_ERRMSG_SIZE); 50 return -1; 51 } 52 53 args->arg_type[0] = STRING_RESULT; 54 args->arg_type[1] = STRING_RESULT; 55 args->arg_type[2] = STRING_RESULT; 56 57 initid->ptr = NULL; ; 59 }
编译链接:
[zhxilin@localhost mysql-redis-test]$ g++ -shared -fPIC -I /usr/include/mysql -lboost_serialization -lboost_system -lboost_thread -o libmyredis.so anet.c test.cpp
编译时需要加上-lboost_serialization -lboost_system -lboost_thread, 表示需要链接三个动态库:libboost_serialization.so、libboost_system.so、libboost_thread.so,否则在运行时会报缺少函数定义的错误。
编译出libmyredis.so之后,将其拷贝到mysql的插件目录下并提权:
[root@localhost mysql-redis-test]# cp libmyredis.so /usr/lib64/mysql/plugin/ & chmod 777 /usr/lib64/mysql/plugin/libmyredis.so
完成之后登录MySQL,创建关联函数测试一下:
mysql `redis_hset`; Query OK, 0 rows affected (0.16 sec) mysqlredis_hset ; Query OK, 0 rows affected (0.02 sec)
先删除老的UDF,注意函数名加反引号(``)。调用UDF测试,返回0,执行成功:
mysql, , ); redis_hset(, , ) row
打开redis-cli,查看结果:
127.0.0.1:6379> HGETALL zhxilin 1) "id" 2) "09388334"
四. 通过MySQL触发器刷新Redis在上一节的基础上,我们想让MySQL在增删改查的时候自动调用UDF,还需要借助MySQL触发器。触发器可以监听INSERT、UPDATE、DELETE等基本操作。在MySQL中,创建触发器的基本语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_statement
trigger_time表示触发时机,值为AFTER或BEFORE;
trigger_event表示触发的事件,值为INSERT、UPDATE、DELETE等;
trigger_statement表示触发器的程序体,可以是一句SQL语句或者调用UDF。
在trigger_statement中,如果有多条SQL语句,需要用BEGIN...END包含起来: