redis缓存数据库实现lamp的高速访问并使用gearman使得数据同步

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

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查看
    在这里插入图片描述
    网页查看
    在这里插入图片描述
根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值