当前位置:首页 > PHP

php redis实现秒杀

2026-02-13 18:53:00PHP

PHP + Redis 实现秒杀功能

秒杀场景的核心在于解决高并发下的超卖问题和系统性能瓶颈。Redis 的高性能和原子操作特性非常适合实现秒杀系统。

使用 Redis 原子操作防止超卖

利用 Redis 的 DECRINCRBY 命令实现原子性库存扣减:

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

$productId = 'product_123';
$userId = uniqid(); // 模拟用户ID

// 预先设置库存
// $redis->set('stock_' . $productId, 100);

// 秒杀逻辑
$remaining = $redis->decr('stock_' . $productId);
if ($remaining >= 0) {
    // 扣减成功,记录用户购买信息
    $redis->sAdd('success_users_' . $productId, $userId);
    echo "秒杀成功";
} else {
    // 库存不足,恢复库存
    $redis->incr('stock_' . $productId);
    echo "秒杀失败";
}

Lua 脚本保证操作原子性

更推荐使用 Lua 脚本保证多个操作的原子性:

$lua = <<<LUA
local stock_key = KEYS[1]
local user_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', user_key, user_id)
    return 1
end
return 0
LUA;

$result = $redis->eval($lua, ['stock_' . $productId, 'success_users_' . $productId, $userId], 2);

使用 Redis 队列缓解压力

将请求先放入队列,异步处理:

// 用户请求入队
$redis->lPush('seckill_queue', json_encode(['user_id' => $userId, 'product_id' => $productId]));

// 后台 worker 处理
while(true) {
    $task = $redis->rPop('seckill_queue');
    if ($task) {
        $data = json_decode($task, true);
        // 处理秒杀逻辑
    }
    usleep(100000); // 0.1秒
}

限流措施

使用 Redis 实现简单限流:

$key = 'user_request_' . $userId;
$limit = 5; // 5次/秒

$current = $redis->incr($key);
if ($current == 1) {
    $redis->expire($key, 1);
}
if ($current > $limit) {
    echo "请求过于频繁";
    exit;
}

数据预热与库存分离

提前将库存加载到 Redis:

php redis实现秒杀

// 从数据库加载库存到Redis
$dbStock = 100; // 从数据库查询
$redis->set('stock_' . $productId, $dbStock);

注意事项

  • Redis 需要配置持久化,避免重启导致数据丢失
  • 考虑使用 Redis 集群提高可用性
  • 最终一致性:异步同步到数据库
  • 前端需要配合进行防重复提交处理
  • 监控 Redis 性能指标,及时扩容

以上方案结合了 Redis 的原子操作、队列和限流机制,能有效应对秒杀场景的高并发挑战。实际应用中可根据业务需求调整细节。

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

相关文章

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节点。每个…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…