如何用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 作为消息队列

相关推荐
Go高并发架构_王工21 小时前
NoSQL与MySQL混合架构设计:从理论到实践(二)
数据库·mysql·nosql
jingfeng5141 天前
MySQL数据类型
数据库·mysql
matlab的学徒1 天前
PostgreSQL 安装与操作指南
数据库·postgresql
sweethhheart1 天前
【typora激活使用】mac操作方式
前端·数据库·macos
启明真纳1 天前
PostgreSQL 单库备份
数据库·postgresql
Amd7941 天前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
数据库·postgresql
wzg20161 天前
pyqt5 简易入门教程
开发语言·数据库·qt
你是狒狒吗1 天前
为什么mysql要有主从复制,主库,从库这种东西
数据库·mysql
倔强的石头1061 天前
【金仓数据库】ksql 指南(一) 连接本地 KingbaseES 数据库与基础交互
数据库·oracle·kingbasees·金仓数据库·ksql
卷Java1 天前
违规通知功能修改说明
java·数据库·微信小程序·uni-app