Redis实现mysql的高速访问以及完成mysql与redis的数据同步

主机分布
172.25.33.1 httpd+php
172.25.33.2 redis
172.25.33.3 Mariadb

172.25.33.1安装httpd php php-mysql

yum -y install httpd php php-mysql

获取测试文件test.php

connect('172.25.33.2',6379) or die ("could net connect redis server"); #redis主机IP
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('172.25.33.3','redis','redhat'); # 连接数据库
                        mysql_select_db(test);
                        $result = mysql_query($query);
                        //如果没有找到$key,就将该查询sql的结果缓存到redis
                        while ($row = mysql_fetch_assoc($result))
                        {
                                $redis->set($row['id'],$row['name']);
                        }
                        $myserver = 'mysql';
                        break;
                }
                else
                {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                }
        }
 
        echo $myserver;
        echo "
"; for ($key = 1; $key < 10; $key++) { echo "number is $key"; echo "
"; echo "name is $data[$key]"; echo "
"; } ?>

添加redis模块
查看php的版本
在这里插入图片描述
上网下载安装同版本php-devel
在这里插入图片描述

yum install php-devel-5.4.16-42.el7.x86_64.rpm

获取phpredis-master压缩包并解压
在这里插入图片描述
进入目录phpredis-master,使用phpize生成configure文件

phpize
./configure
make && make install

在这里插入图片描述
进入目录/usr/lib64/php/modules/下,查看编译后存在的模块文件
在这里插入图片描述
进入/etc/php.d下

cp mysql.ini redis.ini

修改redis.ini
在这里插入图片描述
修改/etc/php.ini
在这里插入图片描述
重启httpd查看已经加载的模块
在这里插入图片描述
172.24.33.2安装redis
修改配置文件/etc/redis/6379.conf
在这里插入图片描述
重启redis

/etc/init.d/redis_6379 restart

172.25.33.3安装mariadb-server

yum install mariadb-server -y
systemctl start mariadb

导入测试用数据库文件
mysql < test.sql
文件内容

use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

在这里插入图片描述
授权数据库权限给用户

grant all on test.* to redis@'%' identified by 'redhat';

进入172.25.33.1/test.php查看结果
Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第1张图片

此时尝试对数据库进行更新

 update test name='redhat' where id='1';

查看结果
Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第2张图片

问题:但是刷新页面不变

解决问题:
数据库端:(172.25.33.3)
配置添加用户自定义函数(可以将mysql关系型数据转换为json格式的UDF工具)
获取压缩包并解压
lib_mysqludf_json-master.zip
在这里插入图片描述
进入该目录下,编译

gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

在这里插入图片描述
拷贝新生成的模块至mysql的模块插件目录下

 cp lib_mysqludf_json-master/lib_mysqludf_json.so /usr/lib64/mysql/plugin/

在这里插入图片描述
查看插件目录

show global variables like 'plugin_dir';

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第3张图片
注册mysql的udf函数并查看

CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

查询

 select * from mysql.func;

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第4张图片
安装gearman软件

yum install -y \
gearmand-1.1.12-18.el7.x86_64.rpm \
libevent-devel-2.0.21-4.el7.x86_64.rpm \
libgearman-1.1.12-18.el7.x86_64.rpm \
libgearman-devel-1.1.12-18.el7.x86_64.rpm

在这里插入图片描述
编译安装mysql的mysqludf的json扩展
在这里插入图片描述
进入该目录

./configure --with-mysql --libdir=/usr/lib64/mysql/plugin
make && make install

在这里插入图片描述
进入数据库,进行注册gearman的udf函数

CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第5张图片
设置mysql端的gearman的前端服务地址

SELECT gman_servers_set('172.25.33.1:4730');

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第6张图片
导入触发器模块

mysql 

内容如下

[root@server3 ~]# cat test.sql
use test;
#CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

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 ;

登录数据库查看触发器

show triggers from test;

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第7张图片
httpd服务器端
编译添加php的gearman模块

./configure && make && make install

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第8张图片
进入 /etc/php.d/
新建文件gearman.ini

; Enable mysql extension module
extension=gearman.so

Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第9张图片
安装gearmand服务

yum install -y \
gearmand-1.1.12-18.el7.x86_64.rpm \
libevent-devel-2.0.21-4.el7.x86_64.rpm \
libgearman-1.1.12-18.el7.x86_64.rpm \
libgearman-devel-1.1.12-18.el7.x86_64.rpm

在这里插入图片描述
开启gearmand服务并重新启动httpd服务

systemctl start gearmand
systemctl enable gearmand
systemctl restart httpd

编写worker.php文件放入/usr/local/下

[root@server1 php.d]# cat /usr/local/worker.php 
addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
 
$redis = new Redis();
$redis->connect('172.25.33.2', 6379); # redis主机的IP
 
while($worker->work());
function syncToRedis($job)
{
        global $redis;
        $workString = $job->workload();
        $work = json_decode($workString);
        if(!isset($work->id)){
                return false;
        }
        $redis->set($work->id, $work->name);
}
?>

后台运行worker.php

nohup php /usr/local/worker.php &

在mysql上尝试更新数据

update test set name='234' where id='4';

在这里插入图片描述
进入test.php页面
此时数据已经更新
Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第10张图片
此时端口打开情况
Redis实现mysql的高速访问以及完成mysql与redis的数据同步_第11张图片

你可能感兴趣的:(高级课程)