在LNMP上搭建redis通过gearman实现同步

本文介绍如何使用Gearman框架实现MySQL数据更新后自动同步到Redis的过程,包括配置、安装及编写触发器和worker端代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis
下载redis
mkdir /usr/local/redis
tar zxf redis-2.8.19.tar.gz
cd redis-2.8.19
make
cd src/
cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/
cd …
cp redis.conf sentinel.conf /usr/local/redis/
下载master
unzip master
cd phpredis-master/
yum -y install autoconf
phpize
./configure --with-php-config=/usr/local/php5/bin/php-config
make && make install
vim /usr/local/php5/php.ini
-》extension=redis.so《-
重启lnmp 网页浏览phpinfo页面函数,查看有没有redis模块
mysql:

[root@gyh ~]# cat /usr/local/nginx/html/2.php

<?php $redis = new Redis(); $redis->connect('192.168.8.218',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.8.218','root'); mysql_select_db(mytest); $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 < 9; $key++) { echo "number is $key"; echo "
"; echo "name is $data[$key]"; echo "
"; } ?>

网页访问192.168.8.218/2.php

通过gearman实现同步
1、介绍
Gearman是一个支持分布式的任务分发框架:
Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。
大致流程:
下面要编写的mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。
2、安装启动
yum -y install gearmand libgearman-devel
如果报错没有找到包的话,就在加一个yum源 这个是阿里源的epel
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
然后yum clean all
yum makecache
/etc/init.d/gearmand start
正在启动 gearmand: [确定]
/etc/init.d/gearmand status
gearmand (pid 7702) 正在运行…
3、安装php的gearman扩
https://pecl.php.net/get/gearman-1.1.1.tgz//网页下载用xftp传输
tar xvf gearman-1.1.1.tgz
cd gearman-1.1.1
phpize //失败就yum -y install autuconf
./configure --with-php-config=/usr/local/php5/bin/phpconfig
make && make install
#如果php的配置文件中没有extension = gearman.so,就加上此行
vim /etc/php.ini
->extension = gearman.so<-
重启lnmp
访问phpinfo查看是否出现gearman模块
4、安装lib_mysqludf_json
lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。
cd /root
wget -c -t 0 https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip
unzip master.zip
cd lib_mysqludf_json-master/
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
若出现—》
lib_mysqludf_json.c:40:23: 错误:my_global.h:没有那个文件或目录
lib_mysqludf_json.c:41:20: 错误:my_sys.h:没有那个文件或目录
lib_mysqludf_json.c:43:19: 错误:mysql.h:没有那个文件或目录
lib_mysqludf_json.c:44:21: 错误:m_ctype.h:没有那个文件或目录
lib_mysqludf_json.c:45:22: 错误:m_string.h:没有那个文件或目录
#这里编译报错是因为没有安装mysql的开发包,如果是源码安装的mysql,需要在/etc/ld.so.conf.d/
#目录下新建一个文件告诉系统mysql的头文件在哪里
yum -y install mysql-devel
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
《----
mysql -uroot
mysql> show global variables like ‘plugin_dir’;
±--------------±------------------------+
| Variable_name | Value |
±--------------±------------------------+
| plugin_dir | /usr/lib64/mysql/plugin |
±--------------±------------------------+
#将模块拷贝到插件目录下
cp lib_mysqludf_json.so /usr/local/mysql/lib/plugin/ 找到自己mysql安装目录下的地址
#注册UDF函数
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME ‘lib_mysqludf_json.so’;
5、安装gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列。
wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
tar -zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/plugin //和上面一样改为自己mysql安装目录下的
make && make install
#注册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;
±-------------------±----±------------------------±---------+
| name | ret | dl | type |
±-------------------±----±------------------------±---------+
| json_object | 0 | lib_mysqludf_json.so | function |
| gman_do_background | 0 | libgearman_mysql_udf.so | function |
| gman_servers_set | 0 | libgearman_mysql_udf.so | function |
±-------------------±----±------------------------±---------+
#指定gearman的服务信息
mysql> SELECT gman_servers_set(‘127.0.0.1:4730’);
6、编写mysql触发器(根据实际情况编写)
在mysql中执行
mysql> use mytest
mysql> DELIMITER mysql>CREATETRIGGERdatatoredisAFTERUPDATEONtestFOREACHROWBEGINSET@RECV=gmandobackground(′syncToRedis′,jsonobject(NEW.idas‘id‘,NEW.nameas‘name‘));//回车−>END mysql> 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`)); //回车 -> ENDmysql>CREATETRIGGERdatatoredisAFTERUPDATEONtestFOREACHROWBEGINSET@RECV=gmandobackground(syncToRedis,jsonobject(NEW.idasid,NEW.nameasname));//>END
mysql> DELIMITER ;
7、编写gearman的worker端
vim usr/local/nginx/html/redis_worker.php //目录是nginx或者apache的网页存放地址
->

<?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('syncToRedis', 'syncToRedis'); $redis = new Redis(); $redis->connect('127.0.0.1', 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); } ?>

<-
#后台运行
nohup /usr/local/php5/bin/php redis_worker.php &
//"redis−>set(redis->set(redis>set(work->id, $work->name);"这条语句就是将id作KEY和name作VALUE分开存储,需要和前面写的php测试代码的存取一致。
8、更新mysql中的数据
mysql> set @RECV = 1;
mysql> select @RECV;
±-----+
| @RECV|
±-----+
| 1 |
±-----+
mysql> use mytest;
mysql> update test set name = ‘ssss’ where id = 1;
mysql> select @RECV;
±-----+
| @RECV|
±-----+
| NULL |
±-----+
从返回值可以看到,触发器是触发成功的(这里的@RECV是上面mysql TIGGER的返回值)。我们在redis中查看数据:
[iyunv@redis redis]# /usr/local/redis/redis-cli
127.0.0.1:6379> get 1
“sven”
也可以刷新网页。看看数据发生变化没
如果没变化。记得关闭selinux
设置完成以后,再次执行update,进入redis进行查看
127.0.0.1:6379> get 1
“ssss”
到这里就基本算是大功告成了,只要application将数据写到mysql中,mysql触发器检测到更新,就会通过Gearman将数据同步到redis中。然后读取的话,就直接从redis中进行读取。当然这只是个实验环境,实际上还有很多细节要调整。
完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值