当前位置:首页 > 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 队列,后台异步处理订单,避免直接冲击数据库:

$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 实现分布式锁,防止用户重复提交:

$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 与数据库库存。失败时采用补偿机制:

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

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php实现定时

php实现定时

PHP 实现定时任务的方法 PHP 本身是脚本语言,通常需要借助外部工具或框架实现定时任务。以下是几种常见方法: 使用 Cron 任务 Linux 系统自带的 Cron 是常用的定时任务工具。通过编…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php实现多态

php实现多态

多态的概念 多态是面向对象编程的三大特性之一,指同一个方法在不同类中有不同实现方式。PHP通过继承和接口实现多态。 通过继承实现多态 父类定义方法,子类重写该方法实现不同行为: class…