实现mysql和redis之间的触发数据同步——mysql 触发器+gearman+worker.php

在上一篇博客中,我们实现了redis作为mysql的缓存数据库,当访问数据时,首先在redis中查找,redis没有时,才会在mysql中查找,那么如何实现当mysql的数据更新时,redis的数据保持同步更新呢?

默认情况下,它是不会自动更新的。

当手动更新mysql时,
在这里插入图片描述在这里插入图片描述访问页面时,发现redis的数据并没有改变
在这里插入图片描述在这里插入图片描述那么如何实现redis的自动同步更新mysql就是本文要讨论的问题。

原理

Gearman是一套用来把程式需求委派给机器,提供通用的程序框架来将任务分发在机器运算。它同时具备并行工作的能力、负载均衡处理的能力,以及在不同程序语言之间沟通的能力。

Gearman的运行过程

Gearman 是一个支持分布式的任务分发框架:

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。

Job:请求的调度者,用来负责协调把 Client 发出的请求转发
给合适的 Worker。核心程序,需要编译安装并以守护进程形式运行在后台。

Worker:请求的处理者,可以是 C,PHP,Perl 等等。
任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行.

因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。

在这里插入图片描述

操作步骤

在这里插入图片描述1.在serevr1中(nginx+php中)
在这里插入图片描述3.在真机,mysql中

在这里插入图片描述通过MySQL UDF + Trigger同步数据到Gearman
MySQL要实现与外部程序互通的最好方式还是通过MySQL UDF(MySQL user defined functions)来实现。为了让MySQL能将数据传入Gearman,这里使用了lib_mysqludf_json和gearman-mysql-udf的组合。

1.生成lib_mysqludf_json.so模块
lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的.
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述添加成功
在这里插入图片描述注册 json 函数,使用lib_mysqludf_json的原因是因为Gearman只接受字符串作为入口参数,可以通过lib_mysqludf_json将MySQL中的数据编码为JSON字符串

在这里插入图片描述

生成libgearman_mysql_udf模块,这个插件是用来管理调用 Gearman 的分布式的队列。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

注册 UDF 函数

在这里插入图片描述
查看所需函数是否配置成功
在这里插入图片描述指定 gearman 的服务信息
在这里插入图片描述

3.编写mysql触发器。通过MySQL触发器实现数据同步
最终同步哪些数据,同步的条件,还是需要根据实际情况决定,比如我希望将数据表data的数据在每次更新时同步,那么编写Trigger如下:

DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
  END$$
DELIMITER ;

在这里插入图片描述在这里插入图片描述
在serevr1中,编辑worker.php。Gearman PHP Worker将MySQL数据异步复制到Redis

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 nohup…表示不间断地运行命令。
gearman的进程号是4730.

netstat -antlpue |grep 4730
tcp        0      0 0.0.0.0:4730                0.0.0.0:*                   LISTEN      495        17787      3594/gearmand       
tcp        0      0 :::4730                     :::*                        LISTEN      495        17788      3594/gearmand

测试:
在真机mysql中更新数据时,
在这里插入图片描述发现redis的数据也同步更新
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值