当前位置:首页 > PHP

php redis实现秒杀

2026-02-15 10:23:02PHP

PHP 与 Redis 实现秒杀功能

秒杀功能的核心在于处理高并发请求,确保库存不超卖且系统稳定。Redis 因其高性能和原子性操作非常适合此类场景。

使用 Redis 原子操作保证库存

通过 Redis 的 DECRINCRBY 命令实现原子性库存扣减。提前将商品库存存入 Redis,例如:

$redis->set('seckill:stock:123', 100); // 商品ID为123,库存100

扣减库存时使用原子操作:

$remaining = $redis->decr('seckill:stock:123');
if ($remaining >= 0) {
    // 库存扣减成功,生成订单
} else {
    // 库存不足,回滚操作
    $redis->incr('seckill:stock:123');
}

使用 Redis 队列削峰

将秒杀请求先放入 Redis 队列,后台异步处理订单,避免直接冲击数据库:

php  redis实现秒杀

$redis->lpush('seckill:queue', json_encode(['user_id' => 1, 'product_id' => 123]));

后台脚本消费队列:

while (true) {
    $data = $redis->rpop('seckill:queue');
    if ($data) {
        $orderData = json_decode($data, true);
        // 处理订单逻辑
    }
}

使用 Redis 分布式锁防重复提交

通过 SETNX 实现分布式锁,防止用户重复提交:

php  redis实现秒杀

$lockKey = 'seckill:lock:' . $userId;
$locked = $redis->setnx($lockKey, 1);
if ($locked) {
    $redis->expire($lockKey, 10); // 锁10秒
    // 处理秒杀逻辑
    $redis->del($lockKey);
} else {
    // 重复请求,直接返回
}

使用 Lua 脚本保证原子性

复杂操作可通过 Lua 脚本保证原子性执行:

$script = "
    local stock = redis.call('GET', KEYS[1])
    if tonumber(stock) > 0 then
        redis.call('DECR', KEYS[1])
        return 1
    end
    return 0
";
$result = $redis->eval($script, ['seckill:stock:123'], 1);
if ($result) {
    // 秒杀成功
}

缓存预热与限流

提前将商品信息加载到 Redis 减少数据库压力。使用 Redis 计数器限制用户请求频率:

$key = 'seckill:rate_limit:' . $userId;
$count = $redis->incr($key);
if ($count == 1) {
    $redis->expire($key, 60); // 60秒内限制
}
if ($count > 10) {
    // 超过10次请求,拒绝
}

数据一致性处理

通过消息队列或定时任务同步 Redis 与数据库库存。失败时采用补偿机制:

// 订单创建成功后同步库存
if ($orderCreated) {
    $db->query("UPDATE products SET stock = stock - 1 WHERE id = 123");
} else {
    $redis->incr('seckill:stock:123'); // 回滚Redis库存
}

注意事项

  • Redis 需要配置持久化防止数据丢失
  • 采用集群模式保证高可用
  • 压力测试验证系统承载能力
  • 前端可增加验证码或倒计时进一步过滤请求

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

相关文章

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HT…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面…