前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel-redis消息队列

laravel-redis消息队列

作者头像
用户10002156
发布2024-01-29 11:31:49
1150
发布2024-01-29 11:31:49
举报
文章被收录于专栏:生活处处有BUG生活处处有BUG

原理

消息队列由消息队列处理程序组成。

基本的流程就是由生产者(业务代码)将数据推送到队列中(此处使用的是Redis),然后由消费者(处理程序)从队列中取出数据进行加工处理。

生产者

代码语言:javascript
复制
# 业务代码
$grade = 88;
$uid = 1;
Redis::rpush('uid_'.$uid, $grade);
# 业务代码

消费者

代码语言:javascript
复制
# 业务代码
$uid = 1;
$grade = Redis::lpop('uid_'.$uid);
# 业务代码

准备数据表

代码语言:javascript
复制
CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grade` int(11) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

模型

代码语言:javascript
复制
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    // 定义模型对应的数据库表名
    protected $table = 'students';
    
}

Laravel 的队列系统

队列配置文件存储在 config/queue.php,在.env文件中,配置queue的连接为 Redis

代码语言:javascript
复制
QUEUE_CONNECTION=redis

任务类

接下来使用命令 php artisan make:job TestQueue 生成任务类 ,任务类会放在app/Jobs目录下。

代码语言:javascript
复制
<?php

namespace App\Jobs;

use App\Student;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;

class TestQueue implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $uid;
    protected $grade;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($uid, $grade)
    {
        $this->uid = $uid;
        $this->grade = $grade;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $res = Student::where('id', $this->uid)->update(['grade' => $this->grade]);
    }

    /**
     * @param null $exception
     * 执行失败的任务
     */
    public function failed($exception = null)
    {
        Log::error($exception);
        dump("执行的任务失败");
    }
}

分发任务

分发任务调用任务类的dispatch方法。

路由

代码语言:javascript
复制
Route::get('/', 'TestController@index');

相关的业务代码

代码语言:javascript
复制
<?php

namespace App\Http\Controllers;

use App\Jobs\TestQueue;

class TestController
{
    public function index()
    {
        $uid = 1;
        $grade = 98;
        return $this->increasedNum($uid, $grade);
    }

    public function increasedNum($uid, $grade){
        if(empty($uid) or empty($grade)){
            return json_encode(['id'=>$uid,'msg'=>'参数异常']);
        }
    
        TestQueue::dispatch($uid, $grade)
        ->onConnection('redis') // 指定连接
        ->onQueue('TestQueueStudent'); // 指定队列
        return json_encode(['id'=>$uid,'msg'=>'成功']);
    }
}

开发测试的时候,可以把->onConnection('redis')指定连接为sync,可以直接执行,返回执行的效果。

监听

开启监听队列 php artisan queue:work redis --queue=TestQueueStudent --tries=3

tries代表失败后最大尝试次数。

代码语言:javascript
复制
root@php:/var/www/html/laravel.cn# php artisan queue:work redis --queue=TestQueueStudent --tries=1
[2024-01-23 08:23:04][J4mbjbfTQ8skWj6BODGBVkAIXOG8cFZ7] Processing: App\Jobs\TestQueue
[2024-01-23 08:23:04][J4mbjbfTQ8skWj6BODGBVkAIXOG8cFZ7] Processed:  App\Jobs\TestQueue
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-23,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 生活处处有BUG 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
    • 生产者
      • 消费者
      • 准备数据表
      • 模型
      • Laravel 的队列系统
      • 任务类
      • 分发任务
        • 路由
          • 相关的业务代码
          • 监听
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com