Table of Contents
1. Redis作为MySQL缓存
1.1 实验环境
node1:192.168.1.11 安装Nginx和php为用户提供服务访问入口
node2:192.168.1.12 安装redis作为缓存服务器,缓存mysql数据
node3:192.168.1.13 安装mysql,存储数据
1.2 LNMP+Redis的实现
1.2.1 node1安装Nginx和php
安装Nginx
- 解压Nginx
tar zxf nginx-1.18.0.tar.gz
- 取消debug模式
vim auto/cc/gcc # 取消debug模式,省空间,可以不做
- 安装编译时所需的依赖
yum install -y pcre-devel zlib-devel
- 编译
./configure --prefix=/usr/local/nginx
- 安装
make && make install
- 安装php及插件gearman(实现redis更新mysql内容时需使用)
- 配置nginx为系统服务
vim /usr/lib/systemd/system/nginx.service
###
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDfile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kiill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
###
- 做软连接,将nginx配置文件连接到/etc下
ln -s /usr/local/nginx/conf/nginx.conf /etc/
- 修改配置文件
vim /etc/nginx.conf
- 开启nginx测试
systemctl start nginx.service
- 浏览器测试访问
可以看到,已经可以正常访问index.html页面
- 开启php,编写php测试页面
systemctl start php-fpm.service
vim index.php
1.2.2 node2安装Redis
安装过程在上一篇博客中,博客地址是:https://blog.csdn.net/m0_37868230/article/details/106391373
1.2.3 node3安装数据库
- 安装数据库
yum install -y mariadb-server
- 启动服务
systemctl start mariadb.service
- 安全初始化
mysql_secure_installation # 安全初始化,初始密码为空,直接回车即可
- 登陆数据库
mysql -uroot -p密码
- 授权
grant all on *.* to redis@'%' identified by 'redhat';
flush privileges;
1.3 php测试页面,创建测试数据
vim index.php
###
<?php
$redis = new Redis();
$redis->connect('192.168.1.12',6379) or die ("could net connect redis server");
$query = "select * from test limit 8";
# 读物8条数据
for ($key = 1; $key < 9; $key++)
{
if(!$redis->get($key))
{
$connect = mysql connect('192.168.1.13','redis','redhat');
mysql_select_db(dsddb);
$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 < 9;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>";
}
?>
###
根据自己实际情况更改redis和mysql绑定的ip端口,创建对应的数据库,比如我这里是testdb,所以下一步,在mysql创建对应数据库,以及内容
CREATE DATABASE dsddb
use dsddb
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');
浏览器测试访问
第一次访问,redis中没有key,从mysql中缓存数据到redis,再次访问
第二次访问,因为redis中缓存有key,所以直接从redis中获取数据
上述已经实现了redis缓存mysql数据,但如果mysql数据更新了,而redis不会去主动同步mysql数据,会造成redis缓存和mysql数据不同步
1.4 gearman实现mysql和redis同步
1.4.1 介绍
Gearman是一个支持分布式的任务分发框架:
- Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
- Gearman Client:可以理解为任务的请求者。
- Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。
我们在最开始安装php插件时已经安装了gearman,编写的mysql触发器,就相当于Gearman的客户端。
修改表,插入表就相当于直接下发任务。
通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式
再通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中
最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。
1.4.2 安装lib_mysqludf_json
- 安装mariadb开发包,否则不支持udf(用户自定义函数)
yum install -y mariadb-devel
- 解压lib_mysqludf_json安装包并编译
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
- 编译好的插件复制到mysql插件目录
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
- 注册udf函数
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
1.4.3 安装gearman-mysql-udf
- 获取安装包和相关依赖
yum install -y 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
- 解压gearman-mysql-udf
tar zxf gearman-mysql-udf-0.6.tar.gz
- 编译
./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/
- 安装
make && make install
- 注册函数
CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
- 注册完成可以查看下mysql的函数
select * from mysql.func;
设置gearman的server,我们是在server1安装的gearman,所以这里填写server1的ip(gearman默认端口4730)
select gman_servers_set('192.168.1.11:4730');
- 打开server1的gearman,验证端口
- 编写mysql触发器
use testdb
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 testdb;
- node1编写gearman的worker
vim syncRedis_worker.php
- 运行该php
nohup php syncRedis_worker.php &> /dev/null &
1.4.4 测试
- 原来访问的数据
- mysqll端更新数据
- 浏览器访问
数据已经更新成功~,访问redis,查看数据,已经更新为新的数据