Redis+MySQL+Gearman实现缓存热点数据、降低压力、同步更新数据的功能


实验环境:
server1:192.168.43.10,配置nginx作为访问入口
server2:192.168.43.20,配置redis缓存数据
server3:192.168.43.30,配置mysql真实存储数据

1.Redis+MySQL实现缓存数据

1.1配置nginx及php

在server1配置nginx和php

1 安装nginx

tar zxf nginx-1.18.0.tar.gz解压包
yum install -y pcre-devel zlib-devel解决依赖性
vim nginx-1.18.0/auto/cc/gcc

#CFLAGS="$CFLAGS -g" 关闭debug

./configure --prefix=/usr/local/nginx预编译
make && make install安装

在这里插入图片描述


2 配置nginx

vim /usr/local/nginx/conf/nginx.conf

        location / {
            root   html;
            index  index.php  index.html index.htm;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

/usr/local/nginx/sbin/nginx -t语法检测
/usr/local/nginx/sbin/nginx启动nginx

在这里插入图片描述
在这里插入图片描述


3 安装php及配置php测试页面

在这里插入图片描述
systemctl restart php-fpm.service在这里插入图片描述
vim /usr/local/nginx/html/index.php配置php测试页面

<?php
        $redis = new Redis();
        $redis->connect('192.168.43.20',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('192.168.43.30','redis','My12345.');
                        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>";
        }
?>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.2 配置redis

安装过程可参考 link.
纯净环境
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.3 配置MySQL

yum install -y mariadb-server
systemctl start mariadb.service启动mysql
mysql_secure_installation进行安全初始化
mysql -uroot -p

MariaDB [(none)]> create database test;
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'My12345.';
MariaDB [(none)]> flush privileges;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


1.4 测试

在MySQL中插入数据

MariaDB [(none)]> use test;

MariaDB [test]> CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

MariaDB [test]> INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

2.Gearman实现同步更新数据

2.1 Gearman的介绍

Gearman提供了一个通用的应用程序框架,可以将工作分配到更适合执行该工作的其他机器或进程。它允许并行执行工作,进行负载平衡处理以及在语言之间调用函数。它可用于各种应用程序,从高可用性网站到数据库复制事件的传输。Gearman是分布式处理如何通信的神经系统。

Gearman驱动的应用程序由三部分组成:客户端,worker和作业服务器。客户端负责创建要运行的作业,并将其发送到作业服务器。作业服务器将找到可以运行该作业并转发作业的合适工人。worker执行客户端请求的工作,并通过作业服务器将响应发送给客户端。 Gearman提供了客户端和辅助API,您的应用程序可以调用它们来与Gearman作业服务器(也称为gearmand)进行通信,因此无需处理网络或作业映射。在内部,Gearman客户端和辅助API使用TCP套接字与作业服务器通信。
在这里插入图片描述


实验环境: 接上面的环境,server1作为job服务器,用来分发任务,在server3充当客户端。
同步mysql的数据,使用到了gearmand服务的udf方式。

1.在server1(job服务器)配置gearmand
yum install -y gearmand-1.1.12-18.el7.x86_64.rpm
在这里插入图片描述
在这里插入图片描述


2.在server3配置udf与gearman客户端
yum install -y mariadb-devel.x86_64 gcc安装插件支持udf及编译工具
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编译用户自定义函数
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/拷贝到数据库的默认插件目录中

在这里插入图片描述
在这里插入图片描述


mysql -uroot -pMy12345.
注册 udf函数,我们创建一个json对象,把数据全部映射为json格式,因为json格式可读性强。

MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

在这里插入图片描述


在server3配置gearman的库文件和依赖性
yum install libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm -y

在这里插入图片描述


在server3配置gearman的用户端
tar zxf gearman-mysql-udf-0.6.tar.gz解压
./configure --libdir=/usr/lib64/mysql/plugin --with-mysql预编译
make && make install编译安装

在这里插入图片描述
在这里插入图片描述


注册udf函数插件及指定gearman服务器

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';

MariaDB [(none)]> select * from mysql.func

MariaDB [(none)]> select gman_servers_set('192.168.43.10:4730');

在这里插入图片描述


定义触发器
vim test.sql
mysql -pMy12345. < 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 ;

在server1中运行worker进程同步数据
vim /usr/local/worker.php

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

$redis = new Redis();
$redis->connect('192.168.43.20', 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);
}
?>

在这里插入图片描述
在这里插入图片描述


3.测试
在这里插入图片描述
在这里插入图片描述
数据处理流程:
mysql的变更触发了触发器 trigger ,然后 json_map插件将变更的数据格式化为json格式便于处理,然后找到 mysql 的 gearman 和 udf 的插件 ,然后找到 gearman(job-server / server1)。 jojb-server 将任务分发给 worker。worker 与 php-gearman 和 php-redis 通信,将数据同步到server2上的 redis,redis 再发送到客户端,同时同步到本地缓存。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!实现点赞和评论功能可以使用Spring Boot作为后端框架,Redis作为缓存数据库MySQL作为持久化数据库,UniApp作为前端框架。以下是一个简单的实现步骤: 1. 创建Spring Boot项目并配置MySQLRedis的连接。 2. 创建实体类,如User、Post等,用于表示用户和帖子。 3. 创建MySQL数据库表,包括用户表和帖子表。 4. 使用Spring Data JPA或MyBatis等框架进行数据库操作,实现用户和帖子的增删改查功能。 5. 在帖子表中添加字段用于存储点赞数和评论数。 6. 在后端编写点赞和评论的接口,分别处理点赞和评论的业务逻辑。 - 点赞接口可以接收用户ID和帖子ID,将点赞数加一,并更新数据库。 - 评论接口可以接收用户ID、帖子ID和评论内容,将评论数加一,并将评论保存到数据库。 7. 使用Redis进行缓存,可以将点赞数和评论数存储在Redis中,以提高访问速度。 - 在点赞接口中,先查询Redis中是否存在点赞数,如果存在则直接返回;否则从数据库中查询并存储到Redis中。 - 在评论接口中,同样先查询Redis中是否存在评论数,如果存在则直接返回;否则从数据库中查询并存储到Redis中。 8. 在UniApp中使用Vue.js等技术进行前端开发,调用后端提供的接口实现点赞和评论的功能。 - 在页面中展示帖子列表,并显示点赞数和评论数。 - 点击点赞按钮时,调用后端的点赞接口,并更新页面上的点赞数。 - 点击评论按钮时,调用后端的评论接口,并更新页面上的评论数。 以上是一个简单的实现方案,具体的细节还需要根据你的实际需求进行调整和完善。希望对你有所帮助!如有更多问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值