当前位置:首页 > 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 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…

php实现过程

php实现过程

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

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…