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公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...
随机推荐
- Recovering deleted Records
[原文] recovering-deleted-records Solution That requires an actual timestamp (or date), you're passing ...
- Android开发快速入门(环境配置、Android Studio安装)
Android是一种激动人心的开源移动平台,它像手机一样无处不在,得到了Google以及其他一些开放手机联盟成员(如三星.HTC.中国移动.Verizon和AT&T等)的支持,因而不能不加以学 ...
- Eclipse自动打开实现类原型的工具
http://eclipse-tools.sourceforge.net/implementors/ I always use this implementors plugin to find all ...
- linux下DHCP服务原理总结
DHCP(全称Dynamic host configuration protocol):动态主机配置协议DHCP工作在OSI的应用层,可以帮助计算机从指定的DHCP服务器获取配置信息的协议.(主要包括 ...
- c#中序列化
序列化(Serialization)是.NET平台的特性之一.1.为什么要序列化:首先你应该明白系列化的目的就不难理解他了.系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算.比如 ...
- Kubernetes deployed on multiple ubuntu nodes
This document describes how to deploy kubernetes on multiple ubuntu nodes, including 1 master node a ...
- Java daemon thread 守护线程
守护线程与普通线程写法上基本么啥区别,在启动线程前, 调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存 ...
- Centos6.2 下 vncserver 的安装
好久没用vnc了, 把今天装的过程记录一下, 这是一个从网上下载的标准Centos6.2 虚机镜像, 已经带了桌面. 默认的用户是root和tom, 口令都是tomtom. 因为ssh服务没起来, 简 ...
- 32位计时器极端情况下产生的bug
用每毫秒更新的32位变量用来计时, 使用这个变量计算离上次操作是否间隔10秒.两种写法: f - lastF <10, 和 f
- 表单 - Form - 无刷新提交原理
为什么Form组件的表单提交可以做到无刷新? EasyUI在提交的时候,将表单作为一个隐藏的iframe进行的提交,并不是我们看到的那个表单进行的提交 并且那个iframe使用了绝对定位,保证页面上不 ...