当前位置:首页 > PHP

php利用redis实现秒杀

2026-04-03 05:08:01PHP

PHP 利用 Redis 实现秒杀功能

秒杀场景的核心在于解决高并发下的超卖和性能问题。Redis 凭借其单线程原子性和高性能特性,是理想的解决方案之一。以下是具体实现方案:

使用 Redis 计数器 + Lua 脚本

Redis 的原子操作可确保计数准确性,Lua 脚本保证操作序列的原子性。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// Lua 脚本(检查库存并扣减)
$lua = <<<LUA
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock > 0 then
    redis.call('DECR', KEYS[1])
    return 1
else
    return 0
end
LUA;

$result = $redis->eval($lua, ['seckill_item_123'], 1);
if ($result) {
    // 秒杀成功,进入订单处理队列
} else {
    // 库存不足
}

预减库存 + 异步下单

  1. 初始化库存

    php利用redis实现秒杀

    redis-cli SET seckill_item_123 100  # 设置库存为100
  2. PHP 预减逻辑

    $stock = $redis->decr('seckill_item_123');
    if ($stock >= 0) {
        // 生成唯一订单ID
        $orderId = uniqid('seckill_');
        // 异步写入订单队列
        $redis->lPush('seckill_orders', json_encode([
            'order_id' => $orderId,
            'item_id'  => 'item_123',
            'user_id'  => $userId
        ]));
    } else {
        $redis->incr('seckill_item_123'); // 恢复库存
    }

防止重复抢购

利用 Redis 的 Set 结构记录已抢购用户:

php利用redis实现秒杀

$key = "seckill_users:item_123";
if (!$redis->sIsMember($key, $userId)) {
    $redis->sAdd($key, $userId);
    // 继续处理秒杀逻辑
} else {
    die("每人限购1件");
}

完整流程设计

  1. 预热阶段

    • 将商品库存加载到 Redis
    • 设置库存键:SET seckill:stock_123 1000
  2. 秒杀阶段

    • 用户请求先经过 Lua 脚本原子扣减
    • 成功后将订单数据推入 RabbitMQ/Kafka
  3. 异步处理

    • 消费队列生成正式订单
    • 失败时通过定时任务恢复库存

注意事项

  • 库存回滚:异步下单失败时需要恢复 Redis 库存
  • 限流措施:结合 Redis 的 INCR 实现接口限流
  • 集群扩展:Redis Cluster 模式下需确保 Lua 脚本的键在相同节点

通过以上方案,PHP 应用可实现 10,000+ QPS 的秒杀处理能力,关键点在于所有库存操作必须在 Redis 内存中完成,避免直接访问数据库。

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

相关文章

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php 抢购实现

php 抢购实现

抢购系统设计要点 高并发抢购系统的核心在于解决超卖问题、保证数据一致性以及提升系统性能。PHP实现需结合数据库、缓存和队列等技术。 数据库层面优化 使用InnoDB引擎的事务特性确保数据一致性。商品…

php实现发帖

php实现发帖

PHP 实现发帖功能 要在 PHP 中实现发帖功能,通常需要结合数据库操作(如 MySQL)和前端表单提交。以下是实现发帖功能的关键步骤: 数据库表设计 创建一个帖子表(posts)存储发帖内容,基…

php发帖实现

php发帖实现

PHP 发帖实现方法 数据库准备 创建一个数据库表用于存储帖子信息,常见的字段包括帖子ID、标题、内容、作者、发布时间等。SQL示例: CREATE TABLE posts ( id INT…