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-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函数:
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公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...
随机推荐
- 关于response.getWriter()写回数据的实际发生时间点
只能说自己平时太粗心了,一些细节问题虽然几次路过,都没有注意过,也没有好好想过. 同事负责的一段微信模块的小逻辑,为了防止微信服务器认为没有接收到请求而重发消息,所以再收到微信服务器发回的消息后,马上 ...
- 用jsmooth + inno生成exe并制作简单安装包
思路: 先由 Jsmooth把jar和相关资源打包生成exe,再由Inno把exe和资源文件打成安装包 一 Jsmooth 1 下载 安装 Jsmooth 地址:jsmooth.sourcefo ...
- SQL存储过程的调用及写法
调用函数: public class SqlProcess { ; public DataSet ReturnSet = null; public SqlDataAdapter adapter = n ...
- [No00004E]千万不要“拼命”工作——写在滴滴总裁柳青患癌症之后
滴滴快的总裁柳青发内部信,透露自己检查出乳腺癌,她今年才37岁. 9月30日,就是国庆前一天,柳青发了内部信,透露了这个消息,她也说已经做完肿瘤摘除手术,"目前感觉还挺好的".她也 ...
- 如何在Actionbarsherlock中一直显示overflow效果?
对Android开发一致性有一定考虑的程序员应当或多或少对Actionbarsherlock这个库有一定的了解.Actionbarsherlock的产生是因为Android在3.0(API 11)之后 ...
- Objective-C 命名规范
http://www.tuicool.com/articles/ERvUbmR 1. 如果方法的返回值是新创建的,那么方法名的首个词应是返回值类型,除非前面还有修饰语如 localizedString ...
- ES5特性Object.seal
一个对象在默认状态下: 1,extensible:可扩展(可以添加新的属性) 2,configurable:可配置(可以改变原有属性的特性,比如修改属性的enumerable) Object.seal ...
- Nginx+keepalived双机热备(主主模式)
之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...
- c#中序列化
序列化(Serialization)是.NET平台的特性之一.1.为什么要序列化:首先你应该明白系列化的目的就不难理解他了.系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算.比如 ...
- Python的高级特性10:无聊的@property
@property装饰器其实有点无聊,单独拿出来作为一个知识点其实没必要,尽管它可以将方法变成属性,让get和set方法更好用,但是,它破坏了python的简洁(不是代码的简洁而是指语法上). 下面来 ...