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

相关推荐
christine-rr4 小时前
linux常用命令(4)——压缩命令
linux·服务器·redis
可涵不会debug4 小时前
【IoTDB】时序数据库选型指南:工业大数据场景下的技术突围
数据库·时序数据库
ByteBlossom4 小时前
MySQL 面试场景题之如何处理 BLOB 和CLOB 数据类型?
数据库·mysql·面试
麦兜*4 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
Slaughter信仰4 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
java·jvm·数据库
麦兜*4 小时前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
-Xie-4 小时前
Mysql杂志(十六)——缓存池
数据库·mysql·缓存
七夜zippoe5 小时前
缓存与数据库一致性实战手册:从故障修复到架构演进
数据库·缓存·架构
凯子坚持 c5 小时前
精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
c++·redis·list