HTML5技术

【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis - zhxilin(2)

字号+ 作者:H5之家 来源:H5之家 2016-10-03 16:00 我要评论( )

使用时需要把redisclient.h、anet.h、fmacros.h、anet.c 这4个文件考到目录下,开始编写关于Redis的UDF。我们定义了redis_hset作为主函数,连接Redis并调用hset插入哈希表,redis_hset_init作为初始化,检查参数个

使用时需要把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包含起来:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 混合开发的几个框架 - 夜枭

    混合开发的几个框架 - 夜枭

    2016-10-03 15:00

  • 前端开发面试题 - wangwen896

    前端开发面试题 - wangwen896

    2016-10-03 14:00

  • 菜鸟介绍达到什么样的标准才能是大公司要的前端 - wangwen896

    菜鸟介绍达到什么样的标准才能是大公司要的前端 - wangwen896

    2016-10-03 10:00

  • 开发资源总结 (持续整理中) - wangwen896

    开发资源总结 (持续整理中) - wangwen896

    2016-10-02 18:00

网友点评
/