当前位置:首页 > PHP

php redis实现秒杀

2026-02-27 17:42:10PHP

PHP Redis 实现秒杀的关键技术

秒杀场景的核心是高并发下的数据一致性和性能问题。Redis 因其高性能和原子性操作成为实现秒杀的重要工具。

使用 Redis 原子操作

通过 Redis 的 DECRINCRBY 命令实现库存扣减,确保原子性:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$stockKey = 'seckill:item:123:stock';

// 检查库存并扣减
if ($redis->decr($stockKey) >= 0) {
    // 扣减成功,生成订单
} else {
    // 库存不足
    $redis->incr($stockKey); // 回滚
}

Lua 脚本保证原子性

复杂逻辑可通过 Lua 脚本实现多命令原子执行:

$lua = <<<LUA
local stockKey = KEYS[1]
local userId = ARGV[1]
local limitKey = 'seckill:item:'..stockKey..':limit'

-- 检查是否已参与
if redis.call('sismember', limitKey, userId) == 1 then
    return 0
end

-- 扣减库存
if redis.call('decr', stockKey) >= 0 then
    redis.call('sadd', limitKey, userId)
    return 1
else
    redis.call('incr', stockKey)
    return -1
end
LUA;

$result = $redis->eval($lua, ['seckill:item:123:stock', $userId], 1);

防止超卖的措施

预减库存:系统启动时加载库存到 Redis,所有扣减在 Redis 完成,最后异步同步到数据库。

限流措施:使用 Redis 计数器实现简单限流:

$rateLimitKey = 'seckill:rate:' . date('Hi');
if ($redis->incr($rateLimitKey) > 1000) {
    // 超过限流阈值
}
$redis->expire($rateLimitKey, 60);

队列削峰

使用 Redis 的 List 结构作为队列缓冲请求:

$queueKey = 'seckill:queue';
// 生产者
$redis->lpush($queueKey, json_encode(['user_id' => $userId, 'item_id' => $itemId]));

// 消费者
while (true) {
    $data = $redis->rpop($queueKey);
    if ($data) {
        // 处理秒杀逻辑
    }
}

数据预热与缓存

提前加载商品数据到 Redis,避免高峰期数据库访问:

$itemData = [
    'stock' => 100,
    'price' => 99,
    'start_time' => strtotime('2023-06-01 20:00:00')
];
$redis->hmset('seckill:item:123', $itemData);

分布式锁处理

防止重复处理使用 Redis 分布式锁:

php redis实现秒杀

$lockKey = 'seckill:lock:' . $itemId;
$token = uniqid();
if ($redis->set($lockKey, $token, ['NX', 'EX' => 10])) {
    try {
        // 处理业务
    } finally {
        if ($redis->get($lockKey) == $token) {
            $redis->del($lockKey);
        }
    }
}

以上方法组合使用可构建完整的秒杀系统,注意根据实际场景调整细节,如添加重试机制、完善错误处理等。

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

相关文章

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php 登录实现

php 登录实现

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

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php实现上传图片

php实现上传图片

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

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…