为什么使用队列?因为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() //创建订单,减少库存 }
多个商品可以创建多个队列
在项目中需要对图片进行裁剪,前端裁剪完成发送base64给后端,但是很意外的PHP获取到的数据和前端有点差距,之前我都是先加密,后端解密,但是这次依然不行。于是使用filter_input方法轻松解决。$base64 = filter_input(INPUT_POST...
在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...
项目中使用服务来执行webservice,由于对方系统api不稳定,经常导致服务崩溃,只能重启,一个月差不多要重启一次。初期的解决办法是捕获异常,然后continue掉。<?php try { $url = 'http...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...
(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...
在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": { &...