文章目录
在上一篇博客中,我们实现了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的数据也同步更新