当前位置:首页 > 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队列处理实际订单创建:

$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利用redis实现秒杀

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

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE o…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php实现mysql

php实现mysql

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

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…