NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器

发布时间:2022-09-29 23:30

redis 是一个高性能的 key-value 数据库。redis 的出现,很大程度补偿memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。
 Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个 append only file(aof)里面(这称为“全持久化模式”)。

现在,我们模拟redis作 mysql 的缓存服务器。

1.redis取数据库的数据

环境如下:

server1 前端页面
server2 redis缓存服务器,确保是master节点(info查看)
server3 数据库mysql

<1.1> server1:安装 lnmp 环境,安装以下软件包:
yum install httpd php php-mysql
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第1张图片

<1.2> server1:创建 php 测试页面

connect('172.25.4.2',6379) or die ("could net connect redis
server");    ##redis服务器的地址和端口
$query = "select * from test limit 9";
for ($key = 1; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('172.25.4.3','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 "
"; for ($key = 1; $key < 10; $key++) { echo "number is $key"; echo "
"; echo "name is $data[$key]"; echo "
"; } ?>

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第2张图片

<1.3> server1安装 php 的 redis 扩展:可以看到现在并不支持redis
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第3张图片
unzip phpredis-master.zip
cd phpredis-master
phpize
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第4张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第5张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第6张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第7张图片
./configure --enable-redis
make && make install

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第8张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第9张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第10张图片

vim /etc/php.ini#设置时区
date.timezone = Asia/Shanghai
在这里插入图片描述
cd /etc/php.d
cp mysql.so redis.so
vim redis.so
#添加以下行
extension=redis.so ##加载 redis 模块
systemctl restart httpd
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第11张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第12张图片

在这里插入图片描述

<1.4> 配置 mysql(sever3)
yum install mariadb-server
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第13张图片
service mysqld start
mysql < test.sql ##导入存放实际测试数据的库
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第14张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第15张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第16张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第17张图片

mysql> grant all on test.* to redis@'%' identified by 'westos';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第18张图片

<1.5>redis服务器的操作(server2):
确保该redis服务器是主redis服务器,通过redis-cli info 命令输出查看状态:
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第19张图片
<1.6> 测试:redis能否读取数据库的数据
浏览器访问172.25.4.1/test.php测试页,访问成功

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第20张图片

redis服务器中存在缓存数据

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第21张图片

<1.7>到这里,我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis中仍然会有对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情况。若更新了数据库的数据,需要先将redis对应的数据删除然后重新读取
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第22张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第23张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第24张图片

2.通过 mysql 触发器将改变的数据同步到 redis 中

(1)通过gearman实现同步原理
 Gearman 是一个支持分布式的任务分发框架:
 Gearman Job Server: Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。
 Gearman Client:可以理解为任务的请求者。
 Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行.
 Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。

环境如下:

sever1 前端页面,Gearman Worker
server2 redis服务器
server3 ,mysql数据库,Gearman Client

大致流程:

1)下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。
2)修改表,插入表就相当于直接下发任务。
3)再通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式
4)再通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中
5)最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新

(2) serveer1:安装 gearman 软件包:

gearmand libgearman-devel libgearman libevent libevent-devel libevent-doc libevent-headers tokyocabinet
service gearmand start#启动服务
netstat -antlp |grep gearmand ##端口为4730

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第25张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第26张图片

(3) server3:安装 lib_mysqludf_json
lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的。
(zip包下载地址:https://github.com/mysqludf/lib_mysqludf_json)
unzip lib_mysqludf_json-master.zip
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第27张图片
yum install mysql-devel
cd lib_mysqludf_json-master
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第28张图片

查看 mysql 的模块目录:

mysql> show global variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value
|
+---------------+-------------------------+
| plugin_dir
| /usr/lib64/mysql/plugin |
+---------------+-------------------------+

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第29张图片
拷贝 lib_mysqludf_json.so 模块:
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第30张图片
注册 UDF 函数
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
查看函数
mysql> select * from mysql.func;

+--------------------+-----+-------------------------+----------+
| name      | ret | dl                 | type|
+--------------------+-----+-------------------------+----------+
| json_object| 0 | lib_mysqludf_json.so | function |
+--------------------+-----+-------------------------+----------+

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第31张图片
(4)server3:安装 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 --libdir=/usr/lib64/mysql/plugin/
make# make install

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第32张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第33张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第34张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第35张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第36张图片
注册 UDF 函数
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
查看函数
mysql> select * from mysql.func;

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第37张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第38张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第39张图片
指定 gearman 的服务信息
mysql> SELECT gman_servers_set('172.25.4.1:4730');

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第40张图片
(5)server3:编写 mysql 触发器(根据实际情况编写)

vim test.sql

use test;
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 ;

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第41张图片
mysql < test.sql
查看触发器
mysql> SHOW TRIGGERS FROM test;
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第42张图片

(6)server1:编写 gearman 的 worker 端

vim worker.php

addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');
$redis = new Redis();
$redis->connect('172.25.4.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 测试代码的存取一致。
}
?>

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第43张图片
(7)server1:安装 php 的 gearman 扩展

(下载地址:https://pecl.php.net)

yum install -y db*-devel
tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
./configure --with-gearman
make && make instal

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第44张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第45张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第46张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第47张图片
cd /etc/php.d
cp mysql.so redis.so
vim redis.so
#添加以下行
extension=gearman.so ##加载 gearman 模块
systemctl restart httpd
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第48张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第49张图片

在这里插入图片描述

后台运行 worker
nohup php worker.php &

在这里插入图片描述
(8)至此,gearman的client和worker端都已经部署完毕,开始测试:在server3中更新数据库的数据,查看redis数据库的数据能否实现实时同步

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第50张图片
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第51张图片

NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器_第52张图片
触发成功!!!

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号