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

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…

php实现验证码的识别

php实现验证码的识别

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

php实现秒杀

php实现秒杀

PHP实现秒杀功能的关键技术 秒杀系统需要解决高并发、数据一致性、系统稳定性等问题。以下是PHP实现秒杀功能的核心技术方案: 数据库优化 使用InnoDB引擎的行级锁和事务特性,确保数据一致性。商品…

php实现单例模式

php实现单例模式

单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。 PHP实现单例模式的关键步骤 私有化构造函…