redis集合 实现 队列

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 创建定时脚本

每次脚本执行就会把订单数据处理写入数据库

以上就是整个流程了,喜欢的可以本地创建运行一下。


发表评论

电子邮件地址不会被公开。 必填项已用*标注