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公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...
随机推荐
- python 笔记(一) —— 不要误用 ++i、--i
ilocker:关注 Android 安全(新手) QQ: 2597294287 在 python 中也可以写 ++i,但含义完全不同于 c/c++.python 的 ++i 并不是将 i 自增 1, ...
- linux进程间通信-管道
一 管道的局限性 管道有两个局限性:(1)他是半双工(即数据只能在一个方向上流动).(2)它只能在具有公共祖先的进程之间使用.一个管道由一个进程创建,然后该 进程调用fork,此后父子进程之间就可该管 ...
- Neutron VxLAN + Linux Bridge 环境中的网络 MTU
1. 基础知识 1.1 MTU 一个网络接口的 MTU 是它一次所能传输的最大数据块的大小.任何超过MTU的数据块都会在传输前分成小的传输单元.MTU 有两个测量层次:网络层和链路层.比如,网络层 ...
- 单机搭建Android开发环境(四)
单机搭建安卓开发环境,前三篇主要是磨刀霍霍,这一篇将重点介绍JDK.REPO.GIT及编译工具的安装,下载项目代码并编译.特别说明,以下操作基于64位12.04 Server版Ubuntu.若采用其他 ...
- NOIP2015跳石头[二分答案]
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...
- U3D的飞船太空射击例子中,使用coroutine
coroutine 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.线程与协同程序的主要区别在于,一个具有多线程的程序 ...
- JSP中九大内置对象及其数据类型
JSP中九大内置对象为: request 请求对象 类型 javax.servlet.ServletRequest 作用域 Req ...
- Maven学习(九)插件介绍
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...
- Sublime3安装过程及常用插件安装及常用快捷键
1 先去http://www.sublimetext.com/官网下载软件,然后网上找一个验证码,注册完成. 2 安装Package Control ,Package Control 插件是一个方 ...
- java 25 - 3 网络编程之 Socket套接字
Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...