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

相关推荐
成为大佬先秃头37 分钟前
数据库连接池:Druid
数据库·mysql·druid
彭于晏Yan2 小时前
Redisson分布式锁
spring boot·redis·分布式
晓华-warm3 小时前
Warm-Flow 1.8.5 正式发布:超时自动审批、暂存功能来了!
数据库
u0136863824 小时前
将Python Web应用部署到服务器(Docker + Nginx)
jvm·数据库·python
light blue bird5 小时前
多页签Razor组支轴业务整顿组件
数据库·.net·ai大数据·多功能图表报表·web mvc + razor
wregjru5 小时前
【mysql】2.数据表操作
数据库·mysql
手握风云-5 小时前
基于 Java 的网页聊天室(三)
服务器·前端·数据库
LcVong5 小时前
MySQL 5.2/5.7 开启Binlog日志详细步骤(附验证+查看+恢复)
数据库·mysql·adb
FL4m3Y4n5 小时前
MySQL缓存策略
数据库·mysql·缓存
wsx_iot5 小时前
TDengine学习
数据库·学习·tdengine