为什么使用队列?因为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() //创建订单,减少库存 }
多个商品可以创建多个队列
xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。(1).创建xmlrpc服务端(求和函数api)function getSum($method,$ar...
面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...
<?php /** * @throws Exception */ function curl() { throw new \Exception('err...
断点下载的原理:http请求头添加Range参数告诉文件服务器端需要的字节范围例如1个文本文件的字节为1000,第一次请求Range: bytes=0-500第二次请求Range: bytes=501-1000通过每次的请求将返回的流追加写入到文件。注意的项目:断点下载服务器端的每次只返回字节传输的...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....
众所周知MyISAM引擎不支持事务,但是我只是知道不支持事务,并未测试具体的表现是什么,测试代码如下:try { //开启事务 Db::startTrans(); &...