如何用Redis作为消息队列
说明:以前背八股文,早就知道 Redis 可以作为消息队列,本文介绍如何实现用 Redis 作为消息队列。
介绍
这里直接介绍 yudao 框架中的实现。yudao 是一套现成的开源系统框架,里面集成了许多基础功能,我们可以在这基础上实现自己的业务功能,就不用重复造轮子了。
- 芋道微服务代码部署
将后端代码 clone 到本地,点开系统的基础组件,可以看到在消息队列的模块中有 redis 实现方式。
使用
(1)Redis版本要求
yudao 使用 Redis 作为消息队列,利用了 Redis 5.0 版本后的 Stream 类型,所以要求 Redis 版本在该版本之上,可参考 yudao 提供的下面这篇文章安装:
- Redis 安装指南(Windows 版本)
下载后,如果你使用的是 windows 操作系统,可使用管理员打开 CMD,敲下面的命令将 Redis 注册成系统的一个服务
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
类,如下:
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
类,泛型指定为需要监听的消息对象
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> {@Overridepublic void onMessage(StudentMessage message) {System.out.println("收到消息:" + message);}
}
这就完成了,是不是九分甚至十分的便捷?
(3)测试
写个 DemoController,测试验证一下
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 {@Resourceprivate 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
,继承该类,可实现在发送、消费消息前后执行相应业务,如下:
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 {@Overridepublic void sendMessageBefore(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("发送消息前。。。。。");}}@Overridepublic void sendMessageAfter(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("发送消息后。。。。。");}}@Overridepublic void consumeMessageBefore(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("消费消息前。。。。。");}}@Overridepublic void consumeMessageAfter(AbstractRedisMessage message) {if (message instanceof StudentMessage) {System.out.println("消费消息后。。。。。");}}
}
比如,可以将发送消息、消费消息记录到数据库表中
总结
本文介绍了 yudao 框架里如何用 Redis 作为消息队列