当前位置:首页 > 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 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php实现秒杀

php实现秒杀

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

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n…

php实现抽奖程序

php实现抽奖程序

PHP实现抽奖程序 基本抽奖逻辑 创建一个简单的抽奖程序需要定义奖品、中奖概率及随机选择逻辑。以下是一个基础实现示例: <?php // 奖品配置(奖品名称 => 概率) $prizes…