当前位置:首页 > PHP

php redis实现秒杀

2026-04-03 02:25:37PHP

使用 PHP 和 Redis 实现秒杀功能

秒杀场景的核心是高并发下的库存控制和防止超卖。Redis 因其高性能和原子操作特性,非常适合实现秒杀系统。

基于 Redis 原子操作实现

使用 Redis 的 DECRINCRBY 命令配合 WATCH 实现原子性库存扣减:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$productId = 'product_123';
$userId = uniqid();

// 初始化库存
$redis->set($productId . '_stock', 100);

// 秒杀逻辑
$redis->watch($productId . '_stock');
$stock = $redis->get($productId . '_stock');
if ($stock > 0) {
    $redis->multi();
    $redis->decr($productId . '_stock');
    $result = $redis->exec();
    if ($result) {
        $redis->sAdd($productId . '_success', $userId);
        echo "秒杀成功";
    } else {
        echo "秒杀失败,请重试";
    }
} else {
    $redis->unwatch();
    echo "库存不足";
}

使用 Lua 脚本保证原子性

Lua 脚本在 Redis 中执行是原子的,更适合高并发场景:

php redis实现秒杀

$lua = <<<LUA
local stock_key = KEYS[1]
local success_key = KEYS[2]
local user_id = ARGV[1]
local stock = tonumber(redis.call('GET', stock_key))
if stock and stock > 0 then
    redis.call('DECR', stock_key)
    redis.call('SADD', success_key, user_id)
    return 1
end
return 0
LUA;

$result = $redis->eval($lua, [$productId.'_stock', $productId.'_success', $userId], 2);
if ($result) {
    echo "秒杀成功";
} else {
    echo "秒杀失败";
}

防止重复购买

使用 Redis 集合记录成功用户,避免重复购买:

if ($redis->sIsMember($productId.'_success', $userId)) {
    echo "您已经参与过秒杀";
    exit;
}

限流措施

使用 Redis 实现简单限流,控制访问频率:

php redis实现秒杀

$ip = $_SERVER['REMOTE_ADDR'];
$key = 'limit:' . $ip;
$limit = 5; // 5次/秒

if ($redis->get($key) >= $limit) {
    echo "访问过于频繁";
    exit;
}

$redis->incr($key);
$redis->expire($key, 1);

异步处理订单

秒杀成功后,将订单信息放入队列异步处理:

if ($result) {
    $orderData = [
        'user_id' => $userId,
        'product_id' => $productId,
        'time' => time()
    ];
    $redis->rPush('order_queue', json_encode($orderData));
}

库存预热

提前将库存加载到 Redis,避免秒杀开始时的数据库压力:

// 从数据库获取库存
$stockFromDB = 100; // 假设从数据库查询得到
$redis->set($productId.'_stock', $stockFromDB);

注意事项

  1. 使用连接池管理 Redis 连接,避免频繁创建连接
  2. 监控 Redis 性能,确保能够承受预期流量
  3. 考虑使用 Redis 集群提高可用性
  4. 秒杀结束后同步 Redis 和数据库的库存数据
  5. 前端应配合使用验证码、按钮禁用等措施防止重复提交

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

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php 登录实现

php 登录实现

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

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…