http://t.zoukankan.com/leijiangsheng-p-12993489.html
先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能。
以下是业务流程图可以参考一下:
然后本地实现思路
截图下单页面
每次购买数量会减少1,设置了1000个库存,用户id 是随机生成的。
本地代码目录
附上代码:
index.php
// var_dump($result); //结果:bool(true)
// var_dump($redis->lpush(“goods”,”111″)); //结果:int(1)
// var_dump($redis->lpush(“goods”,”222″)); //结果:int(2)
// var_dump($redis->lsize(“goods”)); //结果:int(4)
// var_dump($redis->lremove(‘goods’,’a’,2)); //结果:int(2)
//print_r($redis->lgetrange(“uid”,0,-1)); // 查询所有的数据
//print_r($redis->lgetrange(‘uid’,$redis->lsize(“uid”)-2,-1));
?>
$surplus = 1000-$total;
// $total = 10;
if($_GET[‘uid’]){
if($surplus<=0){
echo”“;die;
}
# 把成功的用户id 写入 redis 集合
$redis->lpush(‘uid’,$_GET[‘uid’]);
echo ““;
}
?>
队列模拟下单
当前用户
redis 集合 实现队列 利用定时脚本处理订单业务 入库。。。
快乐大芒果
价格:19.8/kg
已购买数量: ,剩余数量:
—————————
crontab.php代码:
// print_r($rs);
foreach($rs as $k=>$v){
$values .= “(‘{$v}’,’快乐大芒果’),”;
#清除掉这些数据
$redis->lremove(‘uid’,$v,-1);
}
$values = trim($values,’,’);
$sql=”insert into `order`(uid,good_name) values $values”;
if ($link->query($sql) == TRUE) {
echo “成功插入”;
file_put_contents(‘crontab.log’,date(‘Y-m-d H:i:s’,time()).’执行了一次定时任务。’.PHP_EOL,FILE_APPEND);
} else {
echo “插入失败” ;
}
}
—————————-
crontab.bat 代码
N:
“E:phpEnvphpphp-72php.exe” -f “E:phpEnvwwwduiliecrontabcrontab.php”
说明一下:
E:phpEnvphpphp-72php.exe // 是php路径
E:phpEnvwwwduiliecrontabcrontab.php // 处理队列数据入库
——————————
然后创建一个order表 存储数据
CREATE TABLE `order` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘订单表ID’,
`uid` varchar(255) NOT NULL COMMENT ‘下单用户id’,
`good_name` varchar(255) NOT NULL COMMENT ‘下单商品名称’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
windows10 创建定时脚本
每次脚本执行就会把订单数据处理写入数据库
以上就是整个流程了,喜欢的可以本地创建运行一下。