当前位置:首页 > PHP

产品秒杀php实现

2026-03-13 09:52:28PHP

产品秒杀的PHP实现

产品秒杀是高并发场景下的典型应用,需要解决超卖、性能瓶颈等问题。以下是关键实现方案:

数据库设计

创建商品表和订单表,商品表需包含库存字段并设置乐观锁:

CREATE TABLE `seckill_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `stock` int(11) NOT NULL COMMENT '库存',
  `version` int(11) NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
  PRIMARY KEY (`id`)
);

CREATE TABLE `seckill_orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `goods_id` int(11) NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

乐观锁实现

通过版本号控制并发更新,避免超卖:

产品秒杀php实现

$pdo->beginTransaction();
try {
    $sql = "SELECT stock, version FROM seckill_goods WHERE id = ? FOR UPDATE";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$goodsId]);
    $goods = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($goods['stock'] > 0) {
        $updateSql = "UPDATE seckill_goods SET stock = stock - 1, version = version + 1 
                      WHERE id = ? AND version = ?";
        $affected = $pdo->prepare($updateSql)->execute([$goodsId, $goods['version']]);

        if ($affected) {
            // 创建订单
            $orderSql = "INSERT INTO seckill_orders(user_id, goods_id) VALUES(?, ?)";
            $pdo->prepare($orderSql)->execute([$userId, $goodsId]);
            $pdo->commit();
            return true;
        }
    }
    $pdo->rollBack();
    return false;
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

缓存预热

活动开始前将商品信息加载到Redis:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set("seckill:goods:$goodsId:stock", 1000); // 初始化库存
$redis->set("seckill:goods:$goodsId:version", 0);  // 初始化版本号

原子计数器

使用Redis的DECR保证原子操作:

产品秒杀php实现

$remaining = $redis->decr("seckill:goods:$goodsId:stock");
if ($remaining >= 0) {
    // 异步处理订单
    $mq->push(['user_id' => $userId, 'goods_id' => $goodsId]);
    return ['success' => true];
} else {
    $redis->incr("seckill:goods:$goodsId:stock"); // 回滚
    return ['error' => '已售罄'];
}

接口限流

使用Redis实现令牌桶限流:

$rateLimitKey = "seckill:limit:$userId";
$now = microtime(true);
$redis->zRemRangeByScore($rateLimitKey, 0, $now - 60); // 清除60秒前的记录

if ($redis->zCard($rateLimitKey) < 10) { // 每分钟10次
    $redis->zAdd($rateLimitKey, $now, uniqid());
    return true;
}
return false;

异步处理

通过消息队列解耦下单流程:

// 生产者
$mq->push([
    'user_id' => $userId,
    'goods_id' => $goodsId,
    'timestamp' => time()
]);

// 消费者
while ($task = $mq->pop()) {
    $orderService->createOrder($task['user_id'], $task['goods_id']);
}

静态化处理

将商品详情页生成静态HTML:

ob_start();
include 'template/goods_detail.php';
$html = ob_get_clean();
file_put_contents("/static/goods_{$goodsId}.html", $html);

注意事项

  1. 前端需配合倒计时和按钮禁用状态
  2. 采用Nginx分流不同请求路径
  3. 实施服务降级方案应对突发流量
  4. 使用分布式锁处理集群环境
  5. 做好数据监控和报警机制

该方案结合了数据库乐观锁、Redis原子操作、异步处理等技术,能有效应对高并发场景。实际部署时需根据业务规模调整参数,并进行压力测试。

标签: 产品秒杀
分享给朋友:

相关文章

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

秒杀实现php

秒杀实现php

秒杀系统设计要点 高并发场景下秒杀系统的核心在于解决超卖、性能瓶颈和用户体验问题。以下为PHP实现的解决方案: 数据库层面优化 使用InnoDB引擎的事务特性配合行级锁确保数据一致性 START…

js秒杀实现

js秒杀实现

秒杀系统核心实现思路 高并发秒杀系统的核心在于解决超卖问题和性能瓶颈,需结合前端优化、后端限流、缓存预热、异步处理等技术。 前端优化策略 静态资源CDN加速,减少主站请求压力 按钮倒计时与点击防抖,…

秒杀 js 实现

秒杀 js 实现

秒杀功能的实现要点 前端实现秒杀功能需要处理高并发、时间同步、防刷等问题。以下是基于JavaScript的核心实现逻辑: 倒计时功能 使用定时器实现秒杀倒计时,需确保与服务器时间同步: f…

uniapp产品技术

uniapp产品技术

uniapp 产品技术概述 uniapp 是一个基于 Vue.js 的跨平台开发框架,支持一次开发多端部署,包括 iOS、Android、H5、微信小程序、支付宝小程序等。其核心目标是提升开发效率,降…

uniapp 产品文档

uniapp 产品文档

以下是关于 UniApp 产品文档的整理信息,涵盖核心内容与资源获取方式: 官方文档资源 UniApp 的官方文档可通过以下链接访问: 官网文档入口:https://uniapp.dclo…