目录

1.redis结合mysql

2.实验前准备

3.实验:redis与mysql结合

4.自动同步

5.实验前准备

6.实验


1.redis结合mysql

由于目前互联网巨大的访问量,在生产环境中常常需要redis结合mysql来用,如下图例,
我们可以将redis当作mysql的缓存,应用(app)所有读的操作都负载到redis上,因为redis够快,如果直接从mysql上读会对它造成巨大的压力,之前的mysql主从复制同样也是为了解决这样的问题,如果redis中没有想要的内容再从mysql中读并把读到的内容缓存到redis中。但是现在存在一个问题:当应用执行update操作时,就是往mysql中添加内容时,这时候redis无法完成更新,并且mysql无法将更改传递到redis中,因为二者的数据结构不同并且没有专门的连接端口,这时候我们该如何解决呢?
第一种传统的方式:在mysql中事先定义好触发器,通过udf(用户自定义函数)将mysql数据做映射,比如说将其映射为json数据,json数据可以跨平台传输,因此可以将json文件传递给redis从而完成数据的同步。但是这种方式从根本上是对mysql做操作,相当于给数据库创建函数对象,这种操作对数据库的侵入度是比较高的
第二种方式是:目前比较主流的,阿里开发的canal应用,它直接伪装成mysql slave的身份来对mysql进行复制,相当于mysql主从复制,然后通过事先准备好的javaclient将数据同步到redis,由于主从复制是mysql本身的功能,通过mysql主从复制协议实现的,因此侵入mysql数据库的程度更小

redis数据库改成 redis数据存入mysql_mysql


2.实验前准备

server2:需要提供redis

server3:需要php组件

server4:需要MySQL

redis数据库改成 redis数据存入mysql_mysql_02

redis数据库改成 redis数据存入mysql_mysql_03

redis数据库改成 redis数据存入mysql_数据库_04

redis数据库改成 redis数据存入mysql_php_05

redis数据库改成 redis数据存入mysql_mysql_06

redis数据库改成 redis数据存入mysql_数据库_07

redis数据库改成 redis数据存入mysql_redis数据库改成_08

redis数据库改成 redis数据存入mysql_redis_09

redis数据库改成 redis数据存入mysql_redis数据库改成_10

redis数据库改成 redis数据存入mysql_mysql_11

检测php是否可用

redis数据库改成 redis数据存入mysql_php_12

server4 

redis数据库改成 redis数据存入mysql_redis_13


3.实验:redis与mysql结合

配置mysql数据库

scp test.sql server4: ##将测试数据复制到mysql主机中

redis数据库改成 redis数据存入mysql_mysql_14

mysql < test.sql ##测试数据导入数据库

redis数据库改成 redis数据存入mysql_redis_15

redis数据库改成 redis数据存入mysql_mysql_16

grant all on test.* to redis@'%' identified by 'westos'; ##授权远程用户连接

redis数据库改成 redis数据存入mysql_php_17

redis数据库改成 redis数据存入mysql_mysql_18

检测redis与mysql是否建立连接

redis数据库改成 redis数据存入mysql_数据库_19

修改php配置文件test.php

将redis指向server2端;将MySQL指向server4端 

redis数据库改成 redis数据存入mysql_mysql_20

第一次访问,redis中没有缓存,看不到数据库中相关内容 

redis数据库改成 redis数据存入mysql_redis数据库改成_21

再次访问,已将mysql中相关内容缓存进redis中,可以访问到 

redis数据库改成 redis数据存入mysql_mysql_22

修改test组内容

redis数据库改成 redis数据存入mysql_redis数据库改成_23

mysql中更新后,redis并没有同步

redis数据库改成 redis数据存入mysql_php_24

删除redis中的缓存,nginx自动将新的内容缓存进redis中。

redis数据库改成 redis数据存入mysql_php_25

redis数据库改成 redis数据存入mysql_php_26


4.自动同步

介绍

配置 gearman 实现数据同步:
Gearman 是一个支持分布式的任务分发框架:

Gearman Job Server:Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。
大致流程:下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后再通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。

整体流程框图

redis数据库改成 redis数据存入mysql_redis数据库改成_27


5.实验前准备

下载依赖性

redis数据库改成 redis数据存入mysql_数据库_28

redis数据库改成 redis数据存入mysql_redis数据库改成_29

redis数据库改成 redis数据存入mysql_php_30

检查函数

redis数据库改成 redis数据存入mysql_php_31

拷贝 lib_mysqludf_json.so 模块

redis数据库改成 redis数据存入mysql_redis数据库改成_32

查看 mysql 的模块目录

redis数据库改成 redis数据存入mysql_mysql_33

redis数据库改成 redis数据存入mysql_redis_34

gearman-mysql-udf用来管理调用 Gearman 的分布式的队列

redis数据库改成 redis数据存入mysql_mysql_35

编译 

redis数据库改成 redis数据存入mysql_mysql_36

redis数据库改成 redis数据存入mysql_mysql_37

注册 UDF 函数

redis数据库改成 redis数据存入mysql_数据库_38

解决依赖性问题 

redis数据库改成 redis数据存入mysql_mysql_39

redis数据库改成 redis数据存入mysql_数据库_40

开启4730端口 

redis数据库改成 redis数据存入mysql_redis数据库改成_41

指定gearman后台,负责接收mysql更改,但不负责处理,处理交给指定的worker

redis数据库改成 redis数据存入mysql_redis数据库改成_42


6.实验

 客户提交update任务,然后触发器启动,通过触发器中定义的函数将数据同步到redis。

vim test.php

redis数据库改成 redis数据存入mysql_php_43

查看触发器状态

redis数据库改成 redis数据存入mysql_数据库_44

redis数据库改成 redis数据存入mysql_php_45

修改redis指向 

redis数据库改成 redis数据存入mysql_redis数据库改成_46

开启gearman与redis 

redis数据库改成 redis数据存入mysql_数据库_47

将php /usr/local/worker.php 打入后台  

redis数据库改成 redis数据存入mysql_redis_48

修改mysql内容 

redis数据库改成 redis数据存入mysql_数据库_49

实现自动同步 

redis数据库改成 redis数据存入mysql_mysql_50

redis数据库改成 redis数据存入mysql_redis_51