thinkphp6 使用redis处理高并发,在规定时间内,限制5人

可以使用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();
        }
    }
}

     

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值