zoukankan      html  css  js  c++  java
  • 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。 

  • 相关阅读:
    窗体句柄总是0
    该函数设置由不同线程产生的窗口的显示状态。
    zip压缩解压缩 项目icsharpcode-SharpZipLib-e012155
    VS(Microsoft Visual Studio2010)工具打开项目所需的应用程序,出现未安装(.csproj)的应用程序的解决办法
    Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全
    iPhone 6出现后,如何将一份设计稿支持多个尺寸?
    iPhone/Mac Objective-C内存管理教程和原理剖析
    What does the “__block” keyword mean?
    UIView frame, bounds and center
    ARC __bridge modifiers demystified
  • 原文地址:https://www.cnblogs.com/raker/p/4377600.html
Copyright © 2011-2022 走看看