当前位置:首页 > PHP

php redis实现秒杀

2026-02-13 18:53:00PHP

PHP + Redis 实现秒杀功能

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

使用 Redis 原子操作防止超卖

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

php redis实现秒杀

$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 队列缓解压力

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

php 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:

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

注意事项

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

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

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

相关文章

php变量的实现

php变量的实现

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

php 实现链表

php 实现链表

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

php实现扫码登录

php实现扫码登录

PHP 实现扫码登录的方案 扫码登录通常基于以下流程:用户访问网页生成二维码(含唯一标识),手机扫码后确认登录,服务器验证并完成登录状态同步。以下是具体实现方法: 生成二维码与唯一标识 使用 PHP…

php 实现 java md5加密

php 实现 java md5加密

PHP 实现 Java MD5 加密 Java 和 PHP 的 MD5 加密结果可能存在差异,主要由于字符编码和输出格式的不同。以下是确保 PHP 与 Java MD5 加密结果一致的方法。 确保字…

php实现投票

php实现投票

PHP实现投票功能 数据库设计 创建数据库表存储投票数据,例如: CREATE TABLE `votes` ( `id` int(11) NOT NULL AUTO_INCREMENT,…

php 实现的n

php 实现的n

以下是关于 PHP 实现 N 的常见需求及解决方案的整理: 生成 N 个随机数 使用 rand() 或 mt_rand() 函数结合循环生成指定数量的随机数: $n = 10; // 生成10…