当前位置:首页 > 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. 初始化库存

    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 结构记录已抢购用户:

$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. 异步处理

    php利用redis实现秒杀

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

注意事项

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

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

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

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php数据库实现

php数据库实现

PHP 连接 MySQL 数据库 使用 mysqli 扩展连接 MySQL 数据库: <?php $servername = "localhost"; $username = "usernam…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…