如何用Redis作为消息队列

说明:以前背八股文,早就知道 Redis 可以作为消息队列,本文介绍如何实现用 Redis 作为消息队列。

介绍

这里直接介绍 yudao 框架中的实现。yudao 是一套现成的开源系统框架,里面集成了许多基础功能,我们可以在这基础上实现自己的业务功能,就不用重复造轮子了。

将后端代码 clone 到本地,点开系统的基础组件,可以看到在消息队列的模块中有 redis 实现方式。

使用

(1)Redis版本要求

yudao 使用 Redis 作为消息队列,利用了 Redis 5.0 版本后的 Stream 类型,所以要求 Redis 版本在该版本之上,可参考 yudao 提供的下面这篇文章安装:

下载后,如果你使用的是 windows 操作系统,可使用管理员打开 CMD,敲下面的命令将 Redis 注册成系统的一个服务

java 复制代码
redis-server --service-install ‪D:\dev\Redis-x64-5.0.14.1\redis.windows.conf

其中 ‪D:\dev\Redis-x64-5.0.14.1\redis.windows.conf 更换成自己的 redis 配置文件路径

(2)创建消息和监听器

使用起来很便捷,先创建一个消息对象,继承框架中的 AbstractRedisChannelMessage 类,如下:

java 复制代码
import cn.iocoder.yudao.framework.mq.redis.core.pubsub.AbstractRedisChannelMessage;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 学生消息
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class StudentMessage extends AbstractRedisChannelMessage {

    private Long id;

    private String name;

    private String age;
}

再在需要消费该消息的服务里,写一个监听类,继承 AbstractRedisChannelMessageListener 类,泛型指定为需要监听的消息对象

java 复制代码
import cn.iocoder.yudao.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import org.springframework.stereotype.Service;

/**
 * 学生消息监听器
 */
@Service
public class StudentMessageListener extends AbstractRedisChannelMessageListener<StudentMessage> {

    @Override
    public void onMessage(StudentMessage message) {
        System.out.println("收到消息:" + message);
    }
}

这就完成了,是不是九分甚至十分的便捷?

(3)测试

写个 DemoController,测试验证一下

java 复制代码
import cn.iocoder.yudao.framework.mq.redis.core.RedisMQTemplate;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/system/demo")
public class DemoController {

    @Resource
    private RedisMQTemplate redisMQTemplate;

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/send")
    public String send() {
        StudentMessage studentMessage = new StudentMessage().setId(10001L).setName("zhangsan").setAge("男");
        redisMQTemplate.send(studentMessage);
        return "success";
    }
}

启动项目,先登录拿个 token

调用发送消息接口,请求头上带上 token,发送消息成功

监听器消费了消息

扩展

yudao 框架还增加了一个拦截器 RedisMessageInterceptor,继承该类,可实现在发送、消费消息前后执行相应业务,如下:

java 复制代码
import cn.iocoder.yudao.framework.mq.redis.core.interceptor.RedisMessageInterceptor;
import cn.iocoder.yudao.framework.mq.redis.core.message.AbstractRedisMessage;
import cn.iocoder.yudao.module.system.controller.admin.demo.message.StudentMessage;
import org.springframework.stereotype.Component;

/**
 * 学生消息拦截器
 */
@Component
public class StudentMessageInterceptor implements RedisMessageInterceptor {

    @Override
    public void sendMessageBefore(AbstractRedisMessage message) {
        if (message instanceof StudentMessage) {
            System.out.println("发送消息前。。。。。");
        }
    }

    @Override
    public void sendMessageAfter(AbstractRedisMessage message) {
        if (message instanceof StudentMessage) {
            System.out.println("发送消息后。。。。。");
        }
    }

    @Override
    public void consumeMessageBefore(AbstractRedisMessage message) {
        if (message instanceof StudentMessage) {
            System.out.println("消费消息前。。。。。");
        }
    }

    @Override
    public void consumeMessageAfter(AbstractRedisMessage message) {
        if (message instanceof StudentMessage) {
            System.out.println("消费消息后。。。。。");
        }
    }
}

比如,可以将发送消息、消费消息记录到数据库表中

总结

本文介绍了 yudao 框架里如何用 Redis 作为消息队列

相关推荐
熊文豪15 分钟前
当技术遇见生命:金仓数据库温暖医疗每一刻
数据库·kingbasees·金仓数据库·电科金仓
数据知道16 分钟前
【Flask】一文掌握 Flask 基础用法
数据库·后端·python·flask·python web
g***727022 分钟前
【MySQL】数据库和表的操作
数据库·mysql·oracle
zyplayer-doc28 分钟前
目录支持批量操作,文档增加可见范围、锁定功能,PDF查看优化,zyplayer-doc 2.5.8 发布啦!
数据库·人工智能·pdf·编辑器·飞书·石墨文档
“αβ”1 小时前
MySQL库的操作
linux·服务器·网络·数据库·c++·mysql·oracle
基哥的奋斗历程1 小时前
设备在线状态缓存技术方案
缓存
TDengine (老段)1 小时前
TDengine 转化函数 TO_CHAR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
数据库学啊1 小时前
国产时序数据库选型分析:聚焦 TDengine
数据库·时序数据库·tdengine
岚天start1 小时前
源码编译安装的Nginx增加echo模块过程详解
linux·运维·数据库
卷到起飞的数分1 小时前
5.MyBatis持久(dao)层框架
java·数据库·mybatis