当前位置:首页 > PHP > 正文内容

php redis队列实现秒杀 , php用redis 实现秒杀功能

高老师6年前 (2020-01-26)PHP2972

为什么使用队列?因为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()
    //创建订单,减少库存
}

多个商品可以创建多个队列

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/118.html

分享给朋友:

“php redis队列实现秒杀 , php用redis 实现秒杀功能” 的相关文章

PHP生成cookie数组,PHP删除cookie数组

PHP生成cookie数组,PHP删除cookie数组

<?php   //设置Cookies数组 setcookie('Datatype[a]', '1');  setcookie('Datatype[b]', '2');  set...

PHP高并发下数据库值更新的问题

PHP高并发下数据库值更新的问题

(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10    (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...

 php mysql 行锁,php mysql 行级锁,php mysql 行锁定

php mysql 行锁,php mysql 行级锁,php mysql 行锁定

应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...

php trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...

swoole中的worker_num和task_worker_num

swoole中的worker_num和task_worker_num

(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...