当前位置:首页 > 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中实现倒计时功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用setInterval和clearInterval 创建一个倒计时组件,利用setInter…

vue修改功能实现

vue修改功能实现

Vue 修改功能的实现方法 修改功能是 CRUD 操作中的重要部分,在 Vue 中可以通过多种方式实现。以下是几种常见的实现方案: 数据绑定与表单处理 使用 v-model 实现双向数据绑定,快速获…

vue实现插件功能

vue实现插件功能

Vue 插件实现方法 安装与注册插件 在 Vue 项目中,插件通常以独立模块形式存在。通过 Vue.use() 方法注册插件,该方法会自动调用插件的 install 函数。 // 引入插件 imp…

vue实现截图功能

vue实现截图功能

Vue实现截图功能的方法 使用html2canvas库 html2canvas是一个流行的JavaScript库,可以将HTML元素转换为Canvas,进而生成图片。在Vue项目中安装html2can…

vue图片实现功能

vue图片实现功能

图片上传功能实现 使用 <input type="file"> 结合 Vue 的 v-on:change 事件监听文件选择 <template> <input ty…

vue分类功能实现

vue分类功能实现

Vue分类功能实现方法 使用v-for指令渲染分类列表 在Vue模板中使用v-for循环渲染分类数据,结合v-bind动态绑定分类ID或其他属性 <div v-for="category in…