redis实现队列,一定要用crontab定时任务来执行吗

比如说秒杀活动这种高并发的情况下,我们使用redis函数rpush,lpop实现队列处理。
为什么在网上看到的,都是先用rpush把请求先放入队列中比如rpush.php,

$arr = array('h','e','l','l','o','w','o','r','l','d'); // 模拟请求
 
foreach($arr as $k=>$v){
 
  $redis->rpush("mylist",$v);
 
}

然后再用lpop取出队列每个请求lpop.php

$redis->lpop('mylist');

建立定时任务

*/1 * * * * root php /wwwroot/workplace/redis/rpush.php

 */3 * * * * root php /wwwroot/workplace/redis/lpop.php
 

问题:用redis实现消息队列步骤都是这样的吗。进队和出队列分开两个文件,然后用crontab定时执行吗.

阅读 6.9k
9 个回答

不太能理解为什么要用crontab, 消息队列说简单点就是生产者消费者模式,一般是分开处理

生产者: 假如用的是PHP-FPM这种模式,收到请求后直接push到队列里
消费者: 一般都是写一个常驻内存服务阻塞获取队列里面消息(blpop),有新消息就立刻处理

猜测用到crontab是因为没有用阻塞方式获取,然后每3秒检查一下是否有新消息,但是3秒处理一次对于秒杀来说就有些不合适了

一般是在页面中插入list中,维护一个进程来取出队列进行处理

nohup php /wwwroot/workplace/redis/lpop.php & 守护进程执行不是更好么

首先你要把网上看到的那个用crontab方案的理由说出来,可能场景不一样,比如秒杀小米手机,用户下单通过接口把重要的消息rpush进redis队列,然后超过数量就不给rpush了,给用户一个安慰提示,接下来lpop发单了,以上个人看法。

实际上就两个过程:

  1. 生产程序,产生消息,push到消息队列中
  2. 消费程序,读取消息,pop出一条消息并读取

有消息,就去处理消息,没有就休息

crontab 就是产生定时作用,能起到相同作用的还有workerman这些程序,并不一定要是使用

入队列和出队列是两个操作,一个是数据生产者,一个是消费者。生产者只要有数据就可以随时插入队列,而消费者一般是常驻内存定期查询队列有没有数据需要处理,crontab只是定期的一种方式,你也可以自己写一个死循环脚本每sleep多少秒去查询一次数据,然后脚本以守护进程方式运行就行了

守护进程执行消费

新手上路,请多包涵

我想 简单点的做法如问题所说 高并发的请求进行redis的rpush,然后每个高并发请求建立个异步队列用于异步lpop;另外的做法 我看大家好多的都在说生产者和消费者模式,那么 使用RabbitMp来进行生成消费也是可以的,具体操作就得你去研究了

推荐问题
宣传栏