Mysql与Redis的同步实践
一、测试环境在Ubuntu kylin 14.04 64bit
已经安装Mysql、Redis、php、lib_mysqludf_json.so、Gearman。 
点击这里查看测试数据库及表参考 
本文也有些基本操作,在之前文章里有介绍。
1、安装
mysql-udf">安装gearman-mysql-udf
| 1 2 3 4 5 6 7 | apt-get install libgearman-devwget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gztar -xzf gearman-mysql-udf-0.6.tar.gzcd gearman-mysql-udf-0.6./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib/mysql/plugin/makesudo make install | 
注册UDF函数:
| 1 2 3 4 5 6 7 8 9 10 | CREATEFUNCTIONgman_do_background RETURNSSTRING SONAME 'libgearman_mysql_udf.so';CREATEFUNCTIONgman_servers_set RETURNSSTRING SONAME 'libgearman_mysql_udf.so';CREATEFUNCTIONgman_do RETURNSSTRING SONAME "libgearman_mysql_udf.so";CREATEFUNCTIONgman_do_high RETURNSSTRING SONAME "libgearman_mysql_udf.so"; CREATEFUNCTIONgman_do_low RETURNSSTRING SONAME "libgearman_mysql_udf.so";CREATEFUNCTIONgman_do_background RETURNSSTRING SONAME "libgearman_mysql_udf.so";CREATEFUNCTIONgman_do_high_background RETURNSSTRING SONAME "libgearman_mysql_udf.so";CREATEFUNCTIONgman_do_low_background RETURNSSTRING SONAME "libgearman_mysql_udf.so";CREATEAGGREGATE FUNCTIONgman_sum RETURNSINTEGERSONAME "libgearman_mysql_udf.so";CREATEFUNCTIONgman_servers_set RETURNSSTRING SONAME "libgearman_mysql_udf.so"; | 
指定Gearman服务器的信息:
| 1 | SELECTgman_servers_set('127.0.0.1:4730'); | 
使用示例:
参照http://blog.csdn.net/xundh/article/details/46287681 建立一个reverse.php的worker
| 1 2 3 4 5 6 7 8 9 10 | <?php$worker= new GearmanWorker();$worker->addServer();$worker->addFunction("reverse", "my_reverse_function");while ($worker->work());functionmy_reverse_function($job){  returnstrrev($job->workload());}?> | 
输入命令php reverse.php运行。
到mysql里,输入:
| 1 | SELECTgman_do("reverse",'abcdef') AStest FROMUsers; ---FROM Users也可以不带。 | 

| 1 | SELECTgman_do("reverse", password) AStest FROMUsers; | 
可以看到输出结果,其中password列已经被reverse的worker处理,mysql这时充当client端:

还可以输入以下命令测试:
| 1 | SELECTgman_do_high("reverse", password) AStest FROMUsers; --高优先权 | 

| 1 | SELECTgman_do_background("reverse", password) AStest FROMUsers; --后台低优先权,返回主机和作业号。 | 

创建syncToRedis作业
停止前面的reverse worker,建立一个syncToRedis.php
| 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 | <?php$worker = new GearmanWorker();$worker->addServer();$worker->addFunction('syncToRedis', 'syncToRedis');$redis = new Redis();$redis->connect('127.0.0.1', 6379);echo("begin:\n");while($worker->work());functionsyncToRedis($job){        global$redis;        $workString = $job->workload();        $work= json_decode($workString);    echo('get value:');    echo($workString);    echo("\n");    echo('json_decode:');    var_dump($work);    echo("\n");        if(!isset($work->user_id)){                returnfalse;        }        $redis->set($work->user_id, $workString);} | 
在mysql里测试一下:
| 1 | SELECTgman_do("syncToRedis", json_object(user_id asuser_id,passwordaspassword)) AStest FROMUsers; | 

如果redis监控是打开的,可以看到redis已经收到了数据: 
redis查询结果 
2、建立触发器
| 1 2 3 4 5 6 |     DELIMITER $$    CREATETRIGGERdatatoredis AFTERUPDATEONUsers      FOREACH 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.passwordas`password`));        END$$DELIMITER ; | 
执行SQL语句测试:
| 1 2 | insertintoUsers values('8','new','3','hello');updateUsers setemail='new8@qq.com'whereuser_id=8; | 

正常使用时,可以把worker使用&设置为后台任务: 
nohup php syncToReids.php &
学习时的痛苦是暂时的 未学到的痛苦是终生的
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号