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

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php 实现表单验证

php 实现表单验证

表单验证基础方法 使用内置函数和条件判断进行基础验证,例如检查空值、长度限制等: $name = $_POST['name'] ?? ''; $email = $_POST['email'] ??…