mysql到redis的复制

系统开发中时常会需要缓存来提升并发读的能力,这时可以通过mysql的UDF和hiredis来进行同步 


前题:安装了mysql5.6和client ,开发环境window7 32、vs2013

1、安装redis 和 hiredis 

下载地址 GitHub上的MSOpenTech/redis项目地址

具体编译安装方法可以查看

http://www.cnblogs.com/raker/p/4368741.html


2、下载安装mysql2redis 

https://github.com/dawnbreaks/mysql2redis

这里有个问题,由于github上的mysql2redis 是为linux系统写的一个安装项目,所以我们在这里不能直接用,只需要

解压后根目录的src文件夹里面的源文件就OK了。

 

3、部署mysql动态链接库

  

首先打开VS新建一个win32动态链接库工程,选空项目,工程名为my_udf(名字随意)

再新建一个source file,准备好一下库:

1.mysql库文件(安装mysql的时候选择安装开发包,在mysql根目录下就有)

2.mysql2redis里面的src源文件

3.hiredis库文件(在source file新建一个hiredis文件夹):

  • 在hiredis下新建个lib文件夹把在上面第一步下载的redis文件里面,msvs文件下编译出来的debug文件下找出hiredis.lib和Win32_Interop.lib拷贝进去
  • 把redis跟目录下的deps里的hiredis文件夹拷贝到hiredis下
  • 最后把redis 下的src文件夹也拷贝过来,然后进入src里面打除了fmacros.h文件和Win32_Interop文件夹的其他文件删除掉

 

4.在项目设置里面导入各个库

ps:记得要加载2个LIB库

// 项目->属性->链接器->输入->附加依赖项->Win32_Interop.lib; hiredis.lib;
// #pragma comment(lib,"hiredis.lib")
// #pragma comment(lib,"Win32_Interop.lib")


然后将编译生成的my_udf.dll拷贝到mysql的lib里plugin下
在mysql里执行下列语句加载方法

DROP FUNCTION IF EXISTS lib_mysqludf_redis_info;   #删除
DROP FUNCTION IF EXISTS redis_command;

CREATE FUNCTION lib_mysqludf_redis_info RETURNS STRING SONAME 'my_udf.dll';    #加载
CREATE FUNCTION redis_command RETURNS INT SONAME 'my_udf.dll';

 

 

5、在mysql里创建table,trigger 
table:

CREATE  TABLE IF NOT EXISTS `test`.`my_test` (  
 `uid` int NULL ,  
 `name` VARCHAR(20) NOT NULL ,  
  `Money` INT NULL ,  
  PRIMARY KEY (`uid`) ,  
  ENGINE = InnoDB;  

 

trigger 

CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `tri_my_test_insert_redis` BEFORE INSERT ON `my_test` 
    FOR EACH ROW BEGIN
    DECLARE done INT DEFAULT 999;
    DECLARE inserId INT DEFAULT 0;
     
   SELECT MAX(uid)+1 INTO inserId FROM my_test;
SET done = redis_command("127.0.0.1",6379,CONCAT( "set user::",inserId," ", CONCAT("{uid:",inserId,",name:",CAST(new.name AS CHAR),",Money:",new.Money,"}") ) ); IF done > 0 THEN # 45001 抛一个自定义异常终止操作 SIGNAL SQLSTATE '45001' SET message_text = "Redis error!"; END IF; END; $$ DELIMITER ;

 

INSERT INTO my_test(NAME,Money) VALUES('Sally',1000)  



mysql的 
 

redis的 


使用mysql的udf和trigger可以保证mysql和redis的数据一致性,SIGNAL sqlstate '45001'会在redis失败时回滚事物。 

问题:hiredis里递交带空格数据需要这样使用 

1.reply = redisCommand(context, "SET key:%s %s", myid, value);  


那么对于mysql2redis的redis_command是无法工作的,这部分可以为不同命令单写函数。如redis_command_set。 

posted @ 2015-03-30 11:40  Sky_Raker  阅读(807)  评论(0编辑  收藏  举报