redis
| ip(主机名) | 作用 |
|---|---|
| 172.25.32.1(server1) | httpd |
| 172.25.32.2(server2) | redis |
| 172.25.32.3(server3) | mysql |
server2需要安装redis服务。
- server1
[root@server1 utils]# yum install -y php php-mysql httpd##安装服务
- server2
[root@server2 utils]# vim /etc/redis/6379.conf

可以看到server2为master
[root@server2 utils]# redis-cli
127.0.0.1:6379> info

- server3
[root@server3 ~]# yum install -y mariadb-server
[root@server3 ~]# systemctl start mariad
[root@server3 ~]# mysql < test.sql
[root@server3 ~]# mysql##作数据库授权
MariaDB [(none)]> grant all on test.* to redis@’%’ identified by ‘westos’;
test.sql内容:
[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 ;
-
server1
[root@server1 ~]# mv test.php /var/www/html
[root@server1 ~]# php -m | grep mysql
mysql
mysqli
pdo_mysql
[root@server1 ~]# yum install -y unzip
[root@server1 ~]# unzip phpredis-master.zip
[root@server1 ~]# cd phpredis-master
[root@server1 ~]# yum install -y php-devel-5.4.16-42.el7.x86_64.rpm
test.php内容:
[root@server1 php.d]# cat /var/www/html/test.php
<?php
$redis = new Redis();
$redis->connect('172.25.32.2',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('172.25.32.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 "<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>";
}
?>

[root@server1 ~]# cd phpredis-master
[root@server1 phpredis-master]# phpize

[root@server1 phpredis-master]# ./configure
[root@server1 phpredis-master]# make
[root@server1 phpredis-master]# make install
Installing shared extensions: /usr/lib64/php/modules/
[root@server1 phpredis-master]# cd /usr/lib64/php/modules/
[root@server1 modules]# ls

[root@server1 modules]# cd /etc/php.d/
[root@server1 php.d]# vim /etc/php.ini

[root@server1 php.d]# cp mysql.ini redis.ini
[root@server1 php.d]# vim redis.ini

[root@server1 php.d]# php -m | grep redis
redis
[root@server1 php.d]# systemctl start httpd
- 访问测试

MariaDB [test]> select * from test;
MariaDB [test]> update test set name=‘westos’ where id=1;##在数据库中对id为1进行更新,使其为westos
但在网页中访问时数据不会更新,去访问已经存在的数据,只有将其删除时才会重新从数据库获取数据。

删除数据

删除数据后访问
因为redis中没有我们所需要的数据,所以会从数据库重新获取

不需要删除数据对数据进行同步
- server3配置
[root@server3 ~]# unzip lib_mysqludf_json-master.zip
[root@server3 lib_mysqludf_json-master]# ls
lib_mysqludf_json.c lib_mysqludf_json.so README.md
lib_mysqludf_json.html lib_mysqludf_json.sql
[root@server3 lib_mysqludf_json-master]# yum install -y gcc mysql-devel
[root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
[root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin
查看mysqludf的插件

注册gearman的udf函数

[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz
创建gearman的udf函数
[root@server1 ~]# yum install -y gearmand-1.1.12-18.el7.x86_64.rpm 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 --libdir=/usr/lib64/mysql/plugin/ --with-mysql
[root@server3 gearman-mysql-udf-0.6]# make && make install
MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME ‘libgearman_mysql_udf.so’;
MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME ‘libgearman_mysql_udf.so’;

编辑mysqlgearmin的前端插件

编辑mysql端的测试文件打开相应的触发器模块,并且重新导入数据
[root@server3 ~]# mysql < test.sql
[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 ;

- server1配置
[root@server1 ~]# yum install -y gearmand-1.1.12-18.el7.x86_64.rpm 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@server1 ~]# tar zxf gearman-1.1.2.tgz
[root@server1 ~]# cd gearman-1.1.2
[root@server1 gearman-1.1.2]# phpize
[root@server1 gearman-1.1.2]# ./configure

[root@server1 ~]# make && make install
[root@server1 modules]# cd /etc/php.d
[root@server1 php.d]# cp redis.ini gearman.ini
[root@server1 php.d]# vim gearman.ini
[root@server1 ~]# mv worker.php /usr/local/
[root@server1 ~]# systemctl start gearman
[root@server1 ~]# nohup php /usr/local/worker.php &

- 测试
数据库更新

redis查看

网页查看

本文详细介绍了一种利用Redis缓存与MySQL数据库结合的方式,通过Gearman和JSON UDF实现数据更新时的自动同步,避免了缓存和数据库的数据不一致问题。文章包括了在多个服务器上安装和配置相关服务的步骤,以及如何使用PHP和触发器来实现数据同步。
1925

被折叠的 条评论
为什么被折叠?



