当前位置:首页 > PHP

php利用redis实现秒杀

2026-02-13 21:29:53PHP

使用Redis实现PHP秒杀系统

Redis的高性能和原子性操作使其成为实现秒杀系统的理想选择。以下是基于Redis的PHP秒杀解决方案:

数据结构设计

使用Redis的Hash结构存储商品库存和已售数量:

$redis->hSet('seckill_goods', 'item_id_123', 100); // 初始库存
$redis->hSet('seckill_sold', 'item_id_123', 0);    // 初始已售

原子性操作实现

利用Redis的Lua脚本保证原子性:

local key = KEYS[1]
local sold_key = KEYS[2]
local user_id = ARGV[1]
local max_stock = tonumber(redis.call('HGET', key, 'stock'))
local current_sold = tonumber(redis.call('HGET', sold_key, 'sold'))

if current_sold < max_stock then
    redis.call('HINCRBY', sold_key, 'sold', 1)
    redis.call('SADD', 'seckill_success:'..key, user_id)
    return 1
end
return 0

PHP调用示例

$script = <<<LUA
-- 上述Lua脚本内容
LUA;

$result = $redis->eval($script, [
    'seckill_goods:item_id_123', 
    'seckill_sold:item_id_123',
    $user_id
], 2);

防刷策略

  1. 使用Redis计数器限制用户请求频率:

    $key = "user_limit:$user_id";
    if ($redis->incr($key) > 5) {
     die('请求过于频繁');
    }
    $redis->expire($key, 10);
  2. 预减库存避免超卖:

    $stock = $redis->hIncrBy('seckill_goods', 'item_id_123', -1);
    if ($stock < 0) {
     $redis->hIncrBy('seckill_goods', 'item_id_123', 1); // 回滚
     die('已售罄');
    }

异步处理订单

使用Redis队列处理实际订单创建:

php利用redis实现秒杀

$redis->rPush('order_queue', json_encode([
    'user_id' => $user_id,
    'item_id' => 'item_id_123',
    'time' => time()
]));

系统优化建议

  1. 商品数据预热:活动开始前将商品数据加载到Redis
  2. 分布式锁:解决集群环境下的并发问题
  3. 库存分段:将库存分成多个段减少争抢
  4. 多级缓存:结合本地缓存减轻Redis压力

完整流程示例

// 1. 验证用户资格
if ($redis->sIsMember('blacklist', $user_id)) {
    die('黑名单用户');
}

// 2. 频率限制
$requestKey = "user_request:$user_id";
if ($redis->incr($requestKey) > 10) {
    die('请求过多');
}

// 3. 执行秒杀
$script = "..."; // Lua脚本
$result = $redis->eval($script, [$goodsKey, $soldKey, $user_id], 2);

// 4. 处理结果
if ($result) {
    $orderData = [...];
    $redis->rPush('order_queue', json_encode($orderData));
    echo '秒杀成功';
} else {
    echo '秒杀失败';
}

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

相关文章

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php 实现排序

php 实现排序

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

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…