redis——redis做mysql的缓存服务器

实验环境

主机角色
server1(172.25.8.1)web前端
server2(172.25.8.2)redis服务器
server3 (172.25.8.3)mysql
  • 在server1安装前端需要的软件包,server2做好redis,server3安装数据库
[root@server1 ~]# yum install -y http php php-mysql
[root@server3 ~]# yum install -y mariadb-server

  • server1需要的配置
[root@server1 ~]# mv test.php /var/www/html
[root@server1 html]# vim test.php 
<?php
        $redis = new Redis();
        $redis->connect('127.25.8.2',6379) or die ("could net connect redis server");  ## redis主机
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('127.25.8.3','redis','westos');     ## mysql主机
                        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
                {
[root@server1 ~]# unzip phpredis-master.zip   ## 下载该软件包并解压
[root@server1 ~]# cd phpredis-master
[root@server1 phpredis-master]# ls
common.h   debian.control  mkdeb-apache2.sh  redis_session.c
config.m4  igbinary        php_redis.h       redis_session.h
CREDITS    library.c       README.markdown   serialize.list
debian     library.h       redis.c           tests
[root@server1 phpredis-master]# phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
[root@server1 phpredis-master]# ./configure --enable-redis  ##编译
[root@server1 phpredis-master]# make
[root@server1 phpredis-master]# make install
Installing shared extensions:     /usr/lib64/php/modules/
[root@server1 ~]# vim /etc/php.ini   ##修改php配置文件时区
 878 date.timezone = Asia/Shanghai
[root@server1 ~]# cd /etc/php.d/   ##添加redis模块
[root@server1 php.d]# cp mysql.ini redis.ini
[root@server1 php.d]# vim redis.ini 
extension=redis.so
[root@server1 ~]# systemctl restart httpd
[root@server1 ~]# php -m | grep redis  ## 查看模块添加成功
redis

  • server3需要的配置
[root@server3 ~]# systemctl start mariadb
[root@server3 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'westos';  ##认证
Query OK, 0 rows affected (0.00 sec)


在这里插入图片描述

  • server1和server3配置完成后访问web可以看到缓存成功
    在这里插入图片描述
    在这里插入图片描述
    到这里,我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis
    中仍然会有对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情
    况。所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中。
配置 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 数据库的更新。

  • 安装 lib_mysqludf_json
    lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映
    射为 JSON 格式,是通过程序来转换的。
[root@server3 ~]# unzip lib_mysqludf_json-master.zip 
Archive:  lib_mysqludf_json-master.zip
37f851c808c4161beb4d5e535771dc0c59c82de6
   creating: lib_mysqludf_json-master/
  inflating: lib_mysqludf_json-master/README.md  
  inflating: lib_mysqludf_json-master/lib_mysqludf_json.c  
  inflating: lib_mysqludf_json-master/lib_mysqludf_json.html  
  inflating: lib_mysqludf_json-master/lib_mysqludf_json.so  
  inflating: lib_mysqludf_json-master/lib_mysqludf_json.sql  

  • 配置mysl
[root@server3 lib_mysqludf_json-master]# yum install mysql-devel -y
[root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
[root@server3 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show global variables like 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.00 sec)       ##查看 mysql 的模块目录
[root@server3 plugin]# cp ~/lib_mysqludf_json-master/lib_mysqludf_json.so .    ##拷贝 lib_mysqludf_json.so 模块
[root@server3 plugin]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME
    -> 'lib_mysqludf_json.so';     ##注册 UDF 函数
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select * from mysql.func;    ## 查看函数
+-------------+-----+----------------------+----------+
| name        | ret | dl                   | type     |
+-------------+-----+----------------------+----------+
| json_object |   0 | lib_mysqludf_json.so | function |
+-------------+-----+----------------------+----------+
1 row in set (0.00 sec)
  • server1安装gearmand
 
[root@server1 ~]# yum install gearmand-1.1.12-18.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm -y
[root@server1 ~]# systemctl start gearmand

-安装后打开看到4730端口开启,这时gearmand已经开启

在这里插入图片描述

  • server3上安装gearman-mysql-udf以及相关依赖性
    这个插件是用来管理调用 Gearman 的分布式的队列。
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz
[root@server3 ~]# yum install -y libgearman-* -y
[root@server3 ~]# yum install libevent-devel-2.0.21-4.el7.x86_64.rpm -y
[root@server3 ~]# yum install 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
[root@server3 ~]# cd gearman-mysql-udf-0.6
[root@server3 gearman-mysql-udf-0.6]# ./configure --with-mysql --libdir=/usr/lib64/mysql/plugin/
[root@server3 gearman-mysql-udf-0.6]# make
[root@server3 gearman-mysql-udf-0.6]# make install
[root@server3 ~]# mysql      ##注册 UDF 函数
MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
    -> 'libgearman_mysql_udf.so';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
    -> 'libgearman_mysql_udf.so';
Query OK, 0 rows affected (0.00 sec)

-查看函数

在这里插入图片描述

  • 指定 gearman 的服务信息
    在这里插入图片描述
  • 编写 mysql 触发器导入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 ;

[root@server3 ~]# mysql < test.sql 
  • 查看触发器
    在这里插入图片描述
  • 编写 gearman 的 worker 端
[root@server1 ~]# vim worker.php 
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.8.2', 6379);

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);       ###这条语句就是将 id 作 KEY 和
name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。
}
?>

[root@server1 ~]# tar zxf gearman-1.1.2.tgz
[root@server1 ~]# cd gearman-1.1.2
[root@server1 gearman-1.1.2]# phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
[root@server1 gearman-1.1.2]# ./configure 
[root@server1 gearman-1.1.2]# make && make install
[root@server1 ~]# cd /etc/php.d/
[root@server1 php.d]# cp redis.ini gearman.ini
extension=gearman.so
[root@server1 php.d]# systemctl restart httpd
[root@server1 php.d]# php -m | grep gearman
gearman
[root@server1 ~]# mv worker.php /usr/local/
[root@server1 ~]# nohup php /usr/local/worker.php &   将worker打入后台
[1] 6992
[root@server1 ~]# nohup: ignoring input and appending output to ‘nohup.out’

- worker打入后台

在这里插入图片描述

  • 更新数据库
    在这里插入图片描述
    -在server2的redis可以看到更新内容
    在这里插入图片描述
  • server1的web同样可以
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值