为什么使用队列?因为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 session_start(); $_SESSION['username']='lucy'; ?>当我们请求访问上面的脚本,默认会在我们的客户端生成一个名为PHPSESSID的cookie,我这里的值是PHPSESSID=...
在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....
php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...
本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask(1).安装tp6composer create-project topthink/think tp(2).安装定时任务compos...