队列这个玩意,经常使用在日志管理,商城秒杀和一起并发很大的应用场景。之前我一直做了很多的oa系统,对于这个消息队列也一直没有去使用,只是大概了解了一下,所以一直很模糊,最近换了一个公司,公司要做一些小的功能,基本都是突然并发的场景,那么肯定要使用使用队列来解决这样的并发情况。也看了一下第三方的框架,比如rabbitMQ,kafka,大概了解了生产者,和消费者的关系,另外也了解到了一些topic的概念等,但是现在还用不到那么的多,而且公司不大的话使用第三方也会增加支出不是那个公司都能承受的了这样的支出,那么还是自己来弄一个队列,解决并发。
1、先了解一下生产,这个就是往队列里增加内容
public function setMq()
{
for ( $i=0;$i<=100;$i++)
{
Redis::lpush('mq',"this".rand(0,1000));
}
}
这是模拟并发100次请求,直接插入到缓存中,那么mq,的值就是100次生产,实际应用场景不用循环,直接存到缓存中就可以
2、消费,就是把队列中的东西拿出来执行。
public function getMq()
{
while ( true )
{
$a = Redis::rpop('mq');
if ( $a )
{
echo $a;//这个地方是执行业务逻辑的地方
}
else
{
usleep(20000);//这里意思是如果这个队列中没有东西,等待两秒
}
}
}
这个就是消费了,通常都是使用while(true)来进行,这个方法一般定义好路由,都是使用定时任务来执行,比如说一个活动是定中午12点开始,那么12点开始执行这个方法就可以了,这是个死循环会一直执行,所以也不需要担心太多,另外如果这个队列里没有东西我这里写的等待2秒,根据实际情况去更改就好了。写业务逻辑的地方就是一次消费!这个基本上和网上也都差不多了,这里我留一下一个疑问,如果我在这次rpop弹出来的数据写入数据库失败了怎么办,我想的是写到日志中,不知道有没有大神给我留言