mysql队列写入_数据先写进redis用队列,然后定时任务来写 mysql,如何实现?

这篇博客介绍了如何利用PHP在worker模式下与Redis交互,实现数据的获取、清理和处理,将Redis中的数据批量插入到MySQL。通过设置定时任务,确保后台持续运行,并讨论了使用Redis的消息队列功能和PHP的命令行参数处理。文中还提到了内存管理和使用PHP守护进程的方法。
摘要由CSDN通过智能技术生成

之前没接触过redis,能否详细给我解释下如何使用?百度了没找到典型例子啊

用php-worker模式啊。大致应该如此

$cache_data = $redis->get_all();

$redis->flush_all();

$sqlArr = [];

for($item in $cache_data){

array_push($sqlArr,sql_gen($item));

}

execute_sqls($sqlArr);

sleep($sleep_time);

后台运行:

chmod a+x /png/php_daemon #给脚本加上执行权限

nohup /png/php_daemon >/png/php_daemon.log 2>&1 &

或者添加到/etc/rc.local,让其开机自启动运行:

/png/php_daemon >/png/php_daemon.log

php_daemon内容:

#!/png/php/7.0.0/bin/php

<?php

while(1) {

//这里写你的业务逻辑代码.

//注意!每次循环都要显式关闭Redis和MySQL连接.

//同时要注意对可能的连接失败,操作失败进行处理.

//另外记得用unset释放掉不再使用的变量,避免内存泄漏.

sleep(60); //每隔60秒把Redis的数据插入到MySQL中.

}

补充:

PHP提供有2个预定义变量用于PHP脚本接收命令行参数:

http://php.net/manual/zh/reserved.variables.php

$argc 传递给脚本的参数个数

$argv[] 传递给脚本的参数数组

getopt可以用于获取命令行参数选项,返回一个参数名和值的关联数组.

http://php.net/manual/zh/function.getopt.php

单独的字符(不接受值)

后面跟随冒号的字符(此选项需要值)

后面跟随两个冒号的字符(此选项的值可选)

#!/png/php/5.4.39NTS/bin/php

<?php

$argv = getopt('a:b:');

print_r($argv);

chmod +x cli.php

./cli.php -a1024 -b2048 或者 php cli.php -a1024 -b2048

输出:

Array

(

[a] => 1024

[b] => 2048

)

注释掉

$argv = getopt("a:b:")

输出:

Array

(

[0] => ./cli.php

[1] => -a1024

[2] => -b2048

)

写个daemon不停的读redis就行了。

1.程序启动

2.读取新数据(按照

timestamp

排序获取最旧的)

3.没有数据,sleep 1秒

3.有数据,操作mysql,更新最后一次检查的时间戳

timestamp

你不知道redis有消息队列功能么,让其它线程用blpop这种阻塞读取的模式从队列里读消息就可以了

用这个:https://github.com/Footstones/Plumber

可以考虑两种方式:

(1)list作为缓存,借用producer/consumer模式

(2)Pub/Sub,订阅消息,写MySQL

以前我在stackoverflow上也问过这个问题,好多答案都是说redis用list存,然后设置一个每分钟跑的cron任务去读这个list,为什么不用

while (true)

是因为长时间执行的php进程可能会造成内存泄漏。

不过现在我已经在尝试使用rabbitmq来实现队列了,效果也很不错哟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值