什么是队列?我们可以这样理解
我们可以把队列想象成一个很长很长的隧道,并且这个隧道很窄,窄到只能一个人一个人排着走
入列就是加入这个队伍,跟前面的人一样排着队进入隧道
出列就是通过了这个隧道,然后就可以做你想做的事情了
我们在业务中使用队列的话就是这么一个过程,如下
下单(买的人,买的东西等等信息组合成字符串/数组/对象) -> 入列(把上一步组合好的信息加入队列) -> 出列(把信息取出来) -> 操作(存入数据库)
我们这样说吧:一般秒杀时订单会特别的多,但是数据库无法一次性的处理这么多,所以可以先存在消息队列中,无论我进的速度多快,出的速度都是一定的。这样的话就不怕数据库处理不过来了
例子
用队列的话我们可以使用 redis,mysql等,下面我就就用redis来试试
首先是下单
<?//连接redis$redis = new Redis();$redis->connect('127.0.0.1',6379);$password = '123456';$redis->auth($password);//数据处理$userId = isset($_POST['userId']) ? $_POST['userId'] : rand(1,100);//用户$commodity = isset($_POST['commodity']) ? $_POST['commodity'] : '手机';//商品$order_data = json_encode(['userId'=>$userId,'commodity'=>$commodity]);//入列//这里假如我们是做秒杀,并且名额只有10名,所以我们可以进行列表长度判断$len = $redis->lLen('myList');//这里不用 小于等于 是因为 我们是先进行的长度判断的//如 $len=9 的时候进入 if ,插入一个进去就变成10了,所以 $len 的最大值是9if ($len < 10) {$redis->lPush('myList', $order_data);//插入在最右边}else{echo '秒杀完毕,您未抢到';}
这样我们就把下单的数据存入队列中了
接下来就是出列了
注意:这里必须等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
好了,这样我们就创建了一个简单的队列任务了,试试看吧
