zoukankan      html  css  js  c++  java
  • Redis 学习笔记四 Mysql 与Redis的同步实践

    一、测试环境在Ubuntu kylin 14.04 64bit
    
    已经安装Mysql、Redis、php、lib_mysqludf_json.so、Gearman。 
    点击这里查看测试数据库及表参考 
    本文也有些基本操作,在之前文章里有介绍。
    
    1、安装
    
    安装gearman-mysql-udf
    
    apt-get install libgearman-dev
    wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
    tar -xzf gearman-mysql-udf-0.6.tar.gz
    cd gearman-mysql-udf-0.6
    ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib/mysql/plugin/
    make
    sudo make install
    注册UDF函数:
    
    CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
    CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
    CREATE FUNCTION gman_do RETURNS STRING SONAME "libgearman_mysql_udf.so";
    CREATE FUNCTION gman_do_high RETURNS STRING SONAME "libgearman_mysql_udf.so"; 
    CREATE FUNCTION gman_do_low RETURNS STRING SONAME "libgearman_mysql_udf.so";
    CREATE FUNCTION gman_do_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
    CREATE FUNCTION gman_do_high_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
    CREATE FUNCTION gman_do_low_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
    CREATE AGGREGATE FUNCTION gman_sum RETURNS INTEGER SONAME "libgearman_mysql_udf.so";
    CREATE FUNCTION gman_servers_set RETURNS STRING SONAME "libgearman_mysql_udf.so";
    指定Gearman服务器的信息:
    
    SELECT gman_servers_set('127.0.0.1:4730');
    使用示例:
    
    参照http://blog.csdn.net/xundh/article/details/46287681 建立一个reverse.php的worker
    
    <?php
    $worker= new GearmanWorker();
    $worker->addServer();
    $worker->addFunction("reverse", "my_reverse_function");
    while ($worker->work());
    
    function my_reverse_function($job){
      return strrev($job->workload());
    }
    ?>
    输入命令php reverse.php运行。
    
    到mysql里,输入:
    
    SELECT gman_do("reverse",'abcdef') AS test FROM Users; ---FROM Users也可以不带。
    这里写图片描述
    
    SELECT gman_do("reverse", password) AS test FROM Users;
    可以看到输出结果,其中password列已经被reverse的worker处理,mysql这时充当client端:
    
    这里写图片描述
    
    还可以输入以下命令测试:
    
    SELECT gman_do_high("reverse", password) AS test FROM Users; --高优先权
    这里写图片描述
    
    SELECT gman_do_background("reverse", password) AS test FROM Users; --后台低优先权,返回主机和作业号。
    这里写图片描述
    
    创建syncToRedis作业
    
    停止前面的reverse worker,建立一个syncToRedis.php
    
        <?php
        ini_set('default_socket_timeout', -1); //很重要,否则可能报RedisException with message read error on connection ...
        $worker = new GearmanWorker();
        $worker->addServer();
        $worker->addFunction('syncToRedis', 'syncToRedis');
    
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        echo("begin:
    ");
    
        while($worker->work());
        function syncToRedis($job)
        {
                global $redis;
                $workString = $job->workload();
                $work = json_decode($workString);
                echo('get value:');
                echo($workString);
                echo("
    ");
                echo('json_decode:');
                var_dump($work);
                echo("
    ");
                if(!isset($work->user_id)){
                        return false;
                }
                $redis->set($work->user_id, $workString);
        }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    在mysql里测试一下:
    
        SELECT gman_do("syncToRedis", json_object(user_id as user_id,password as password)) AS test FROM Users;
    这里写图片描述
    
    如果redis监控是打开的,可以看到redis已经收到了数据: 
    这里写图片描述
    
    redis查询结果 
    这里写图片描述
    
    2、建立触发器
    
        DELIMITER $$
        CREATE TRIGGER datatoredis AFTER UPDATE ON Users
          FOR EACH ROW BEGIN
            SET @ret=gman_do_background('syncToRedis', json_object(NEW.user_id as `user_id`, NEW.email as `email`,NEW.display_name as `display_name`,NEW.password as `password`));  
          END$$
    DELIMITER ;
    执行SQL语句测试:
    
    insert into Users values('8','new','3','hello');
    update Users set email='new8@qq.com' where user_id=8;
    这里写图片描述
    
    正常使用时,可以把worker使用&设置为后台任务: 
    nohup php syncToReids.php &
    
    其它问题
    
    有的时候,命令行执行php语句时可能会提示下面的错误,
    
    [root@iZ230296jm2Z redis]# php syncToRedis.php PHP Fatal error: Class ‘Redis’ not found in /home/wwwroot/default/youai/php/redis/syncToRedis.php on line 6 
    处理方法: 
    运行php命令和apache或ngnix可能使用了不同的php.ini,即使在php.ini里看到加载了redis,还需要在php命令行使用php.ini里也增加Redis模块。 
    查看ngnix使用的php.ini位置使用
  • 相关阅读:
    rt_thread studio结合cubmx进行stm32驱动开发学习
    rt_thread之时钟管理
    rt_thread线程间通讯
    使用jQuery开发iOS风格的页面导航菜单
    使用jQuery开发一个带有密码强度检验的超酷注册页面
    使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
    [英] 推荐 15 个 jQuery 选择框插件
    JavaScript封装Ajax(类JQuery中$.ajax()方法)
    阿里前端电话面试
    基于HTML5的Web跨设备超声波通信方案
  • 原文地址:https://www.cnblogs.com/archoncap/p/5385110.html
Copyright © 2011-2022 走看看