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。