使用laravel实现redis队列

1. 需求

发生一个请求到一个服务器时,这个服务器需要请求别的服务器数据,而这个请求是写在同步任务的方法里,只有等这个任务执行完成才能执行后面的代码;通常这种情况会影响网站的请求速度,因此可以使用redis队列去解决这个问题,也可以使用rabbitmq

2. 实现步骤

  1. 配置redis连接
    REDIS_HOST=127.0.0.1
    REDIS_PASSWORD=null
    REDIS_PORT=6379
  2. 配置队列驱动(默认是同步)
    QUEUE_CONNECTION=redis
  3. 创建队列任务
    php artisan make:job ProcessOrder
  4. 编辑任务逻辑
    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;
    
    class ProcessOrder implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $orderId;
    
        public function __construct($orderId)
        {
            $this->orderId = $orderId;
        }
    
        public function handle()
        {
            // 处理订单逻辑
            $order = \App\Models\Order::find($this->orderId);
            
            if ($order) {
                $order->status = 'processing';
                $order->save();
                
                // 模拟耗时操作
                sleep(5);
                
                $order->status = 'completed';
                $order->save();
            }
        }
    }

  5. 将任务加入队列中
    <?php
    
    namespace App\Http\Controllers;
    
    use App\Jobs\ProcessOrder;
    use Illuminate\Http\Request;
    
    class OrderController extends Controller
    {
        public function store(Request $request)
        {
            // 创建订单
            $order = \App\Models\Order::create([
                'user_id' => auth()->id(),
                'amount' => $request->amount,
                'status' => 'pending'
            ]);
    
            // 将任务推送到队列
            ProcessOrder::dispatch($order->id)
                ->onQueue('orders')
                ->delay(now()->addMinutes(1));
    
            return response()->json(['message' => 'Order created and queued for processing']);
        }
    }

  6. 启动队列监听器
    php artisan queue:work --queue=orders

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值