什么是队列?我们可以这样理解

我们可以把队列想象成一个很长很长的隧道,并且这个隧道很窄,窄到只能一个人一个人排着走
入列就是加入这个队伍,跟前面的人一样排着队进入隧道
出列就是通过了这个隧道,然后就可以做你想做的事情了

我们在业务中使用队列的话就是这么一个过程,如下
下单(买的人,买的东西等等信息组合成字符串/数组/对象) -> 入列(把上一步组合好的信息加入队列) -> 出列(把信息取出来) -> 操作(存入数据库)

我们这样说吧:一般秒杀时订单会特别的多,但是数据库无法一次性的处理这么多,所以可以先存在消息队列中,无论我进的速度多快,出的速度都是一定的。这样的话就不怕数据库处理不过来了

例子

用队列的话我们可以使用 redis,mysql等,下面我就就用redis来试试

首先是下单

  1. <?
  2. //连接redis
  3. $redis = new Redis();
  4. $redis->connect('127.0.0.1',6379);
  5. $password = '123456';
  6. $redis->auth($password);
  7. //数据处理
  8. $userId = isset($_POST['userId']) ? $_POST['userId'] : rand(1,100);//用户
  9. $commodity = isset($_POST['commodity']) ? $_POST['commodity'] : '手机';//商品
  10. $order_data = json_encode(['userId'=>$userId,'commodity'=>$commodity]);
  11. //入列
  12. //这里假如我们是做秒杀,并且名额只有10名,所以我们可以进行列表长度判断
  13. $len = $redis->lLen('myList');
  14. //这里不用 小于等于 是因为 我们是先进行的长度判断的
  15. //如 $len=9 的时候进入 if ,插入一个进去就变成10了,所以 $len 的最大值是9
  16. if ($len < 10) {
  17. $redis->lPush('myList', $order_data);//插入在最右边
  18. }else{
  19. echo '秒杀完毕,您未抢到';
  20. }

这样我们就把下单的数据存入队列中了

接下来就是出列了

注意:这里必须等10个商品全部进入到redis队列后才能执行。因为同时执行的话,就是边入列边出列了,这样会导致超卖的问题出现。解决请看 高并发下PHP+REDIS简单实现秒杀功能

<?
//连接redis
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$password = '123456';
$redis->auth($password);
$data = $redis->lPop('myList');//从最左边取出
if (empty($data)){
    return false;
}
$data = json_decode($data,true);
//下面就是存数据库了。。。

出列我们是需要守护进程的

这里我们就用定时任务吧

$ crontab -e

输入以下内容

*/1 * * * * root php /wwwroot/chulie.php

好了,这样我们就创建了一个简单的队列任务了,试试看吧