Redis 作 mysql 的缓存服务器

搭建redis 作为 mysql 的缓存服务器

server1:mysql
server2:redis客户端
server3:Redis 作 mysql 的缓存服务器

server3
安装nginx

yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm php*

这里写图片描述

安装phpredis-master

unzip phpredis-master.zip

cd phpredis-master

phpize

这里写图片描述
这里写图片描述
编译

./configure

make && make install

这里写图片描述
安装
这里写图片描述
这里写图片描述
配置php

vim /etc/php.ini #添加以下行
date.timezone = Asia/Shanghai #设置时区

/etc/php-fpm.conf文件不做更改 

这里写图片描述
php.ini文件内容:
这里写图片描述
配置nginx

cd /etc/php-fpm.d/

vim www.conf
 user = nginx
 group = nginx

vim /etc/nginx/conf.d/default.conf
location / {
    root html;
    index index.php index.html index.htm;
}
location ~ \.php$ {
    root  html;
    fastcgi_pass
    127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name;
    include fastcgi_params;
}

这里写图片描述
/etc/nginx/conf.d/default.conf内容
这里写图片描述
www.conf内容
这里写图片描述
这里写图片描述
创建php测试页面

cd /usr/share/nginx/html

vim index.php
<?php
phpinfo()
?>

nginx -s reload

这里写图片描述
配置/usr/share/nginx/html/index.php文件

[root@server3 redis]# vim test.php
<?php
        $redis = new Redis();
        $redis->connect('127.0.0.1',6379) or die ("could net connect redis server");
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('127.0.0.1','redis','westos');
                        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 "<br>";
        for ($key = 1; $key < 10; $key++)
        {
                echo "number is <b><font color=#FF0000>$key</font></b>"; 
                echo "<br>"; 
                echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
                echo "<br>";
        }
?>

cd /root/redis

cp test.php /usr/share/nginx/html/index.php

# 更改redis和mysql的ip,并设置mysql的用户和密码(如下图)
vim /usr/share/nginx/html/index.php

这里写图片描述
/usr/share/nginx/html/index.php 内容
这里写图片描述
配置redis.ini
这里写图片描述
redis.ini文件:
这里写图片描述
server2
安装redis,配置为master
之前实验用它做了slave,所以需要编辑/etc/redis/6379.conf,注释掉slaveof那一行,使它成为master
这里写图片描述
查看

[root@server2 utils]# redis-cli
127.0.0.1:6379> info

这里写图片描述
server1
安装数据库
这里写图片描述
登录数据库
这里写图片描述
建立用户并授权
这里写图片描述
导入

[root@server1 ~]# vim 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 ;

mysql < test.sql

/etc/init.d/mysqld restart

这里写图片描述
test.sql内容
这里写图片描述
查看数据库
这里写图片描述
在server2查看redis
这里写图片描述
在浏览器访问
这里写图片描述
到这里,我们已经实现了redis作为mysql的缓存服务器,但是如果更新了mysql,redis中仍然会有对应的 KEY,数据就不会更新,此时就会出现mysql和 redis 数据不一致的情况。所以接下来就要通过mysql触发器将改变的数据同步到redis中,可以用gearman来让它同步

配置 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 数据库的更新
server1
在server1安装lib_mysqludf_json-master
这里写图片描述
这里写图片描述
这里写图片描述
注册 UDF 函数

create function json _object returns string soname 'lib_mysqludf_json.so'

这里写图片描述
安装 gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列
这里写图片描述
这里写图片描述
编译
这里写图片描述
这里写图片描述
这里写图片描述
注册 UDF 函数
这里写图片描述
指定 gearman 的服务信息
这里写图片描述
编写 mysql 触发器
导入
这里写图片描述
test.sql内容:
这里写图片描述
server3
编写 gearman 的 worker 端
后台运行 worker

vim worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('127.0.0.1', 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);
}
?>

这里写图片描述
worker.php内容:
这里写图片描述
拷贝文件
解压gearman-1.1.2.tgz
编译
这里写图片描述

make 
make install

这里写图片描述
编辑gearman.ini
重新加载服务
这里写图片描述
gearman.ini内容
这里写图片描述
启动gearmand
这里写图片描述
server1
更新数据库
这里写图片描述
server2
查看redis:同步成功
这里写图片描述
浏览器访问
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值