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
|
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服务器的信息:
|
1
|
SELECT gman_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());function my_reverse_function($job){ return strrev($job->workload());}?> |
输入命令php reverse.php运行。
到mysql里,输入:
|
1
|
SELECT gman_do("reverse",'abcdef') AS test FROM Users; ---FROM Users也可以不带。 |

|
1
|
SELECT gman_do("reverse", password) AS test FROM Users; |
可以看到输出结果,其中password列已经被reverse的worker处理,mysql这时充当client端:

还可以输入以下命令测试:
|
1
|
SELECT gman_do_high("reverse", password) AS test FROM Users; --高优先权 |

|
1
|
SELECT gman_do_background("reverse", password) AS test FROM Users; --后台低优先权,返回主机和作业号。 |

创建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());function syncToRedis($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)){ return false; } $redis->set($work->user_id, $workString);} |
在mysql里测试一下:
|
1
|
SELECT gman_do("syncToRedis", json_object(user_id as user_id,password as password)) AS test FROM Users; |

如果redis监控是打开的,可以看到redis已经收到了数据: 
redis查询结果 
2、建立触发器
|
1
2
3
4
5
6
|
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语句测试:
|
1
2
|
insert into Users values('8','new','3','hello');update Users set email='new8@qq.com' where user_id=8; |

正常使用时,可以把worker使用&设置为后台任务:
nohup php syncToReids.php &
Mysql与Redis的同步实践的更多相关文章
- Redis 学习笔记四 Mysql 与Redis的同步实践
一.测试环境在Ubuntu kylin 14.04 64bit 已经安装Mysql.Redis.php.lib_mysqludf_json.so.Gearman. 点击这里查看测试数据库及表参考 本文 ...
- 转载:MySQL和Redis 数据同步解决方案整理
from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自 ...
- Mysql和Redis数据同步策略
为什么对缓存只删除不更新 不更新缓存是防止并发更新导致的数据不一致. 所以为了降低数据不一致的概率,不应该更新缓存,而是直接将其删除, 然后等待下次发生cache miss时再把数据库中的数据同步到缓 ...
- 通过Gearman实现MySQL到Redis的数据同步
对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...
- redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)
一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...
- Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
[TOC] 1, 环境 CentOS, MySQL, Redis, Nodejs 2, Redis简介 Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list ...
- JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来 ...
- 禧云Redis跨机房双向同步实践
编者荐语: 2019年4月16日跨机房Redis同步中间件(Rotter)上线,团餐率先商用: 以下文章来源于云纵达摩院 ,作者杨海波 禧云信息/研发中心/杨海波 20191115 关键词:Rot ...
- MySQL/RDS数据如何同步到MaxCompute之实践讲解
摘要:大数据计算服务(MaxCompute,原名ODPS)是阿里云提供的一种快速.完全托管的EB级数据仓库解决方案.本文章中阿里云MaxCompute公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...
随机推荐
- Android中 int,float,Double,String 互相转换
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt( ...
- JAVA学习网址收藏
什么是JDK?http://baike.baidu.com/subview/25214/5047948.htm?fr=aladdin Java经典入门教程(环境说明) http://wenku.bai ...
- ASP.NET Web API 安全筛选器
原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...
- ajax小结
1. http是一种无状态协议 2. http请求:四部分组成 ① http 请求的方法或动作,如:GET / POST ② 正在请求的URL,总得知道请求的地址是什么 ③ 请求头,包含一些客户端环境 ...
- 洛谷U4727小L的二叉树[树转序列 LIS]
题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...
- java函数参数默认值
java函数参数默认值 今天,需要设定java函数参数的默认值,发现按照其它语言中的方法行不通 java中似乎只能通过函数的重载来实现 函数参数默认代码
- SQL 2008 windows登录失败,错误18456, 更正
可能的原因:密码有效性验证失败.该密码太短,不符合 Windows 策略要求. 本地设置可能被域设置覆盖.而域设置中指定了安全策略,密码必须有一定的复杂性.重新更改sa密码. 第一步.以windows ...
- [No00000C]Word快捷键大全 Word2013/2010/2007/2003常用快捷键大全
Word对于我们办公来说,是不可缺少的办公软件,因为没有它我们可能无法进行许多任务.所以现在的文员和办公室工作的人,最基础的就是会熟悉的使用Office办公软件.在此,为提高大家Word使用水平,特为 ...
- Memcache基本使用
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到内 ...
- js的scroll详解
scrollTop : 滚动条滚动距离 说明:chrome下他会以为滚动条是文档元素的,所以需要做兼容 ...