当前位置:首页 > PHP

php秒杀功能的实现

2026-01-15 13:45:59PHP

秒杀功能的核心设计

高并发场景下秒杀系统的核心在于解决超卖问题和性能瓶颈。需要结合缓存、队列、锁机制等技术实现。

数据库设计

商品表需包含库存字段,例如:

CREATE TABLE `seckill_goods` (
  `id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `stock` int(11) NOT NULL COMMENT '库存',
  `start_time` datetime NOT NULL COMMENT '秒杀开始时间',
  `end_time` datetime NOT NULL COMMENT '秒杀结束时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

订单表记录秒杀成功记录:

CREATE TABLE `seckill_orders` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `goods_id` int(11) NOT NULL,
  `create_time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

乐观锁实现

通过版本号控制并发:

php秒杀功能的实现

// 获取商品信息时同时获取版本号
$goods = $db->query("SELECT stock, version FROM seckill_goods WHERE id = $goods_id");

// 更新时校验版本号
$result = $db->execute(
    "UPDATE seckill_goods SET stock = stock - 1, version = version + 1 
     WHERE id = $goods_id AND version = {$goods['version']}"
);

if ($db->affectedRows() > 0) {
    // 创建订单
    $db->execute("INSERT INTO seckill_orders (...) VALUES (...)");
}

Redis预减库存

活动开始前将库存加载到Redis:

$redis = new Redis();
$redis->set("seckill:goods:$goods_id:stock", 1000);

秒杀时原子操作递减:

$remaining = $redis->decr("seckill:goods:$goods_id:stock");
if ($remaining >= 0) {
    // 进入下单队列
    $redis->lPush("seckill:order_queue", json_encode([
        'user_id' => $userId,
        'goods_id' => $goodsId
    ]));
} else {
    // 已售罄
}

消息队列处理

使用RabbitMQ处理实际下单:

php秒杀功能的实现

// 生产者
$channel->queue_declare('order_queue');
$msg = new AMQPMessage($orderData);
$channel->basic_publish($msg, '', 'order_queue');

// 消费者
$callback = function ($msg) {
    // 处理订单创建
    createOrder(json_decode($msg->body, true));
    $msg->ack();
};
$channel->basic_consume('order_queue', '', false, false, false, false, $callback);

限流措施

使用Redis实现计数器限流:

$key = "seckill:user:$userId:request";
$count = $redis->incr($key);
$redis->expire($key, 10);

if ($count > 5) {
    // 超过限制次数
    return false;
}

系统优化建议

前端实施按钮防重复点击

document.getElementById('seckill-btn').addEventListener('click', function() {
    this.disabled = true;
    // 提交请求
});

Nginx层限流配置:

limit_req_zone $binary_remote_addr zone=seckill:10m rate=10r/s;

location /seckill {
    limit_req zone=seckill burst=20;
    proxy_pass http://backend;
}

注意事项

活动开始前预热Redis数据 库存回补机制需要单独设计 分布式环境下需使用RedLock等分布式锁 监控系统需实时监控库存和订单量

标签: 功能秒杀
分享给朋友:

相关文章

vue实现功能

vue实现功能

Vue 实现功能的方法 Vue.js 是一个流行的前端框架,用于构建用户界面。以下是几种常见的功能实现方法: 数据绑定 Vue 提供了双向数据绑定,可以通过 v-model 指令实现表单输入和应用状…

vue实现app功能

vue实现app功能

Vue 实现 App 功能的常见方法 使用 Capacitor 或 Cordova 进行混合开发 Vue 结合 Capacitor 或 Cordova 可以将 Web 应用打包成原生 App。Capa…

h5实现手机摇一摇功能

h5实现手机摇一摇功能

实现原理 手机摇一摇功能基于设备加速度传感器(DeviceMotionEvent),通过监听设备的加速度变化来判断用户是否进行了摇晃动作。HTML5提供了相关API获取设备传感器数据。 基本实现步骤…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…

vue实现弹窗功能

vue实现弹窗功能

实现基础弹窗组件 在Vue中创建弹窗通常需要定义一个组件,利用v-if或v-show控制显示隐藏。以下是一个基础弹窗组件的实现: <template> <div class="…

vue实现预览功能

vue实现预览功能

Vue 实现文件预览功能 使用 FileReader 实现本地文件预览 通过 HTML5 的 FileReader API 可以读取本地文件内容并显示预览。创建一个文件上传组件,监听 change…