当前位置:首页 > PHP

php 秒杀实现

2026-02-28 11:05:30PHP

秒杀系统设计要点

高并发、低延迟、数据一致性是秒杀系统的核心挑战。PHP实现需结合缓存、队列、数据库优化等技术。

数据库设计优化

创建专门的秒杀商品表,包含库存、开始/结束时间等字段。使用InnoDB引擎确保事务支持。

CREATE TABLE `seckill_goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `stock` int(11) NOT NULL COMMENT '库存',
  `start_time` datetime NOT NULL,
  `end_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

缓存预热技术

活动开始前将商品信息加载到Redis,使用哈希结构存储:

$redis->hMSet('seckill:goods:1', [
    'stock' => 100,
    'start' => strtotime('2023-06-01 20:00:00'),
    'end' => strtotime('2023-06-01 21:00:00')
]);

原子计数器实现

Redis的DECR命令保证原子性减库存:

$remaining = $redis->eval(
    "local stock = tonumber(redis.call('HGET', KEYS[1], 'stock'))
     if stock <= 0 then return 0 end
     redis.call('HINCRBY', KEYS[1], 'stock', -1)
     return stock - 1",
    1, 'seckill:goods:1'
);

消息队列削峰

使用RabbitMQ或Kafka处理下单请求,PHP示例:

php 秒杀实现

$channel->queue_declare('seckill_queue', false, true, false, false);
$msg = new AMQPMessage(json_encode(['user_id'=>1, 'goods_id'=>1]));
$channel->basic_publish($msg, '', 'seckill_queue');

分布式锁控制

防止超卖使用Redis分布式锁:

$lockKey = 'seckill:lock:1';
$randomValue = uniqid();
if ($redis->set($lockKey, $randomValue, ['NX', 'EX'=>10])) {
    try {
        // 处理业务逻辑
    } finally {
        $redis->eval("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) end", 
            1, $lockKey, $randomValue);
    }
}

库存双重校验

数据库层最终校验,使用乐观锁:

UPDATE `seckill_goods` SET `stock` = `stock` - 1 
WHERE `id` = 1 AND `stock` > 0;

限流措施实现

Nginx层限流配置:

php 秒杀实现

limit_req_zone $binary_remote_addr zone=seckill:10m rate=100r/s;
location /seckill {
    limit_req zone=seckill burst=200;
}

PHP代码层令牌桶算法:

$rate = 100; // 每秒100个令牌
$capacity = 200;
$lastTime = $redis->get('seckill:last_time');
$currentTokens = min($capacity, 
    ($lastTime ? ($redis->get('seckill:tokens') + ($now - $lastTime)*$rate/1000) : $capacity));
if ($currentTokens < 1) {
    header('HTTP/1.1 429 Too Many Requests');
    exit;
}
$redis->set('seckill:tokens', $currentTokens - 1);
$redis->set('seckill:last_time', microtime(true));

服务降级方案

当系统压力过大时,返回静态页面:

if ($load > 80) {
    readfile('static/seckill_fallback.html');
    exit;
}

数据一致性保障

使用定时任务同步Redis和数据库库存:

$goods = $redis->hGetAll('seckill:goods:1');
$db->query("UPDATE seckill_goods SET stock = {$goods['stock']} WHERE id = 1");

标签: 秒杀php
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searc…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…