当前位置:首页 > 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 脚本实现多命令原子执行:

php redis实现秒杀

$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 计数器实现简单限流:

php 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 分布式锁:

$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 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…

php实现注册登陆

php实现注册登陆

PHP 注册功能实现 创建数据库表结构(MySQL示例): CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…