可以使用Redis实现高并发下的订单秒杀处理。下面是一个示例代码来演示如何使用Redis来限制同一时间内的订单秒杀人数不超过5人。
首先,确保已经安装了Redis扩展并配置好了Redis连接信息。
在控制器中,可以这样处理订单秒杀:
use think\Controller;
use think\facade\Cache;
class SeckillController extends Controller
{
public function seckill()
{
$user = 'user_id_123'; // 用户标识,这里以用户ID为例
// 获取当前时间戳
$currentTime = time();
// 定义秒杀持续时间(单位:秒)
$seconds = 60; // 假设秒杀持续时间为60秒
// 定义秒杀限制人数
$limit = 5; // 假设限制5人秒杀
try {
// 尝试获取秒杀限制缓存
$seckillLimit = Cache::get('seckill_limit');
$seckillUsers = Cache::get('seckill_users');
// 判断是否已经超过秒杀持续时间,如果超过则清除缓存
if ($seckillLimit && $seckillLimit['expire_time'] < $currentTime) {
Cache::rm('seckill_limit');
Cache::rm('seckill_users');
$seckillLimit = null;
$seckillUsers = [];
}
if ($seckillLimit) {
// 判断当前秒杀人数是否已达到限制
if (count($seckillUsers) >= $seckillLimit['limit']) {
throw new \Exception('当前秒杀人数已达到限制');
}
// 添加当前用户到秒杀用户列表中
$seckillUsers[] = $user;
Cache::set('seckill_users', $seckillUsers, $seckillLimit['expire_time'] - $currentTime);
} else {
// 设置秒杀限制
$seckillLimit = [
'limit' => $limit,
'expire_time' => $currentTime + $seconds,
];
// 添加当前用户到秒杀用户列表中
$seckillUsers = [$user];
Cache::set('seckill_limit', $seckillLimit, $seconds);
Cache::set('seckill_users', $seckillUsers, $seconds);
}
// 执行秒杀逻辑
// 减少库存
$transaction->decr($stockKey);
// 记录用户已经参与秒杀
$transaction->set("seckill_$productId:$userId", 1);
return '秒杀成功';
} catch (\Exception $e) {
return '秒杀失败: ' . $e->getMessage();
}
}
}