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


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

Redis php mysql

youne 10 years, 10 months ago
qqwqwz answered 10 years, 10 months ago

可以考虑两种方式:
(1)list作为缓存,借用producer/consumer模式
(2)Pub/Sub,订阅消息,写MySQL

sinfi answered 10 years, 10 months ago

以前我在 stackoverflow 上也问过这个问题,好多答案都是说redis用list存,然后设置一个每分钟跑的cron任务去读这个list,为什么不用 while (true) 是因为长时间执行的php进程可能会造成内存泄漏。

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

柳生十兵卫 answered 10 years, 10 months ago

后台运行:


 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
)

qewas answered 10 years, 10 months ago

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

BAKA傲娇受 answered 10 years, 10 months ago

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

1.程序启动
2.读取新数据(按照 timestamp 排序获取最旧的)
3.没有数据,sleep 1秒
3.有数据,操作mysql,更新最后一次检查的时间戳 timestamp

萌之死忠党 answered 10 years, 10 months ago

用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);

神腿蓋世蔣中正 answered 10 years, 10 months ago

Your Answer