为什么使用队列?因为pop取队列具有原子性。假如我们需要秒杀一个商品id,我们先将商品的库存保存到一个队列。例如:
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //定义商品Id $good_id = 1; //定义商品的库存数量 $count = 10; //为商品定义一个库存队列key $seckillKey = '2021_1_26_seckill_' . $good_id; //向当前商品队列写入库存 for ($i = 1; $i <= $count; $i++) { $redis->lPush($seckillKey, $i); } echo "商品id:{$good_id}的商品队列设置成功";
将商品id1的库存10件全部保存到队列。
然后创建一个前台的秒杀的脚本,如下:
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //获取用户要秒杀的商品id $good_id = $_GET['id'] ?? 0; if(empty($good_id)) { die('请传递正确的商品id'); } //商品库存队列key $seckillKey = '2021_1_26_seckill_' . $good_id; //从库存队列提取库存 $stock = $redis->lPop($seckillKey); if (!$stock) { die('秒杀失败,库存不足!'); } else { echo '秒杀成功' . PHP_EOL; //todo() //创建订单,减少库存 }
多个商品可以创建多个队列
<?php //设置Cookies数组 setcookie('Datatype[a]', '1'); setcookie('Datatype[b]', '2'); set...
(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10 (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...
应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...