为什么使用队列?因为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中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo//创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不...
array_merge是最常用的数组合并方法,+号同样也可以,但是却有很大不同。array_merge遇到相同字符串key,后面数组的key会覆盖前面数组的key,+号正好相反。$a = [ 'one' => 'A on...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。(1).创建xmlrpc服务端(求和函数api)function getSum($method,$ar...