初识redis--Redis 作 mysql 的缓存服务器

安装redis

tar zxf redis-4.0.8.tar.gz

直接make && make install (因为存在Makefile文件)

注:提前安装依赖否则有错误缓存文件

这里写图片描述

进入 utils目录进行安装并设置redis的基本参数

这里写图片描述

这里写图片描述

redis-cli进入redis的交互页面
这里写图片描述

修改redis配置文件

vim /etc/redis/6379.conf
    #bind 127.0.0.1
    protected-mode no #保护模式关闭

重启redis
这里写图片描述

安装 lnmp 环境(php nginx)

这里写图片描述
这里写图片描述

修改php配置文件的时区

vim /etc/php.ini
    date.timezone = Asia/Shanghai

php配置文件的用户使用(默认为apache)

vim /etc/php-fpm.d/www.conf
    user = nginx
    group = nginx

启动php

php中加入和redis交互的模块

yum install -y unzip
unzip phpredis-master.zip

进入解压后的目录中加载模块

phpize

编译

./configure --enable-redis

安装

make && make install 

添加模块文件

cd /etc/php.d/
vim redis.ini
    extension=redis.so

在nginx的html中编写实验页面

cd /usr/share/nginx/html/
vim test.php

<?php
        $redis = new Redis();
        $redis->connect('172.25.40.1',6379) or die ("could net connect redis server");#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('172.25.40.5','redis','westos');#数据库的server机及所使用用户和密码
                        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';
                        breaion=redis.so

                }
                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>";

extension=redis.so
                echo "<br>";

                echo "name is <b><font color=#FF0000>$data[$key]</font></b>";

                echo "<br>";
        }
?>

在nginx配置文件中将php模块打开并修改访问文件和路径

vim /etc/nginx/conf.d/default.conf 

这里写图片描述

这里写图片描述

在nginx的html里写一个测试页面,开启nginx

cd /usr/share/nginx/html/
vim index.php
    <?php
    phpinfo()
    ?>

成功

安装数据库

yum install -y mysql-server
rpm -qa | grep mysql
mysql-server-5.1.71-1.el6.x86_64
mysql-5.1.71-1.el6.x86_64
mysql-libs-5.1.71-1.el6.x86_64

注:使用5.7版的可能会出现错误

进入数据库的交互页面,添加授权用户密码及使用权限

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

添加一个test库

mysql < test.sql
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 ;

test库的数据为:

这里写图片描述

此时测试:
(通过访问nginx的test.php)
第一次数据是从mysql中取出来
这里写图片描述

之后的数据都是从redis缓存中读取

这里写图片描述

redis中也可以看到缓存数据

这里写图片描述

但这里存在一个问题,数据库的信息如果更新redis是没有同步的

到这里,我们已经实现了 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 数据库的更新。

  1. 安装 gearman 软件包:
    这里写图片描述

启动服务

这里写图片描述

  1. 安装 php 的 gearman 扩展

https://pecl.php.net

tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
./configure --with-php-config=/usr/bin/php-config  #编译(安装依赖性)
make && make install
 vim /etc/php.ini
extension=gearman.so     #编写php模块
/etc/init.d/php-fpm reload
  1. 安装 lib_mysqludf_json
    lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映
    射为 JSON 格式,是通过程序来转换的。
    https://github.com/mysqludf/lib_mysqludf_json
yum install -y mysql-devel
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-master
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

查看 mysql 的模块目录:
这里写图片描述

拷贝 lib_mysqludf_json.so 模块:

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

注册 UDF 函数,查看函数

这里写图片描述

  1. 安装 gearman-mysql-udf

这个插件是用来管理调用 Gearman 的分布式的队列。
https://launchpad.net/gearman-mysql-udf

tar zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --with-mysql=/usr/bin/mysql_config
--libdir=/usr/lib64/mysql/plugin/
(yum install -y libgearman-* libevent-*)
make# make install

这里写图片描述

注册 UDF 函数,查看函数

这里写图片描述

指定 gearman 的服务信息

这里写图片描述

  1. 编写 mysql 触发器(根据实际情况编写)
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

查看触发器

这里写图片描述

  1. 编写 gearman 的 worker 端
vim worker.php

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

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

后台运行 worker

nohup php worker.php &

这里写图片描述

  1. 更新 mysql 中的数据

这里写图片描述

查看 redis

这里写图片描述

刷新测试页面数据同步

这里写图片描述

整个细节流程展示:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值