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

相关推荐
叫我阿柒啊4 分钟前
Java全栈工程师面试实战:从基础到微服务的深度解析
java·redis·微服务·node.js·vue3·全栈开发·电商平台
颜如玉4 分钟前
Redis scan高位进位加法机制浅析
redis·后端·开源
遇见你的雩风18 分钟前
【MySQL】CRUD基础详解
数据库·mysql
卖寂寞的小男孩2 小时前
spark数据缓存机制
大数据·缓存·spark
夜雨听萧瑟2 小时前
sqlite创建数据库,创建表,插入数据,查询数据的C++ demo
数据库·sqlite
叫我阿柒啊2 小时前
从全栈开发到微服务架构:一次真实的Java面试实录
java·redis·ci/cd·微服务·vue3·springboot·jwt
.Shu.3 小时前
Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【四、事务引擎核心 - MVCC与锁机制】
数据库·mysql
多工坊3 小时前
【DataGrip】连接达梦数据库后,能查询数据但是看不到表的几种情况分析,达梦数据库驱动包下载DmJdbcDriver18.jar
java·数据库·jar
Aileen_0v04 小时前
【分布式系统架构全解析:从单机到微服务,Redis如何成为性能加速器?】
redis·微服务·云原生·架构