目录
- 一、简介
- 1、介绍
- 2、对比
- 二、整合spring的data-redis实现
- 1、使用依赖
- 2、配置类
- 2.1、配置RedisTemplate bean
- 2.2、异常类
- 3、实体类
- 3.1、User
- 3.2、Book
- 4、发送消息
- 4.1、RedisStreamUtil工具类
- 4.2、通过延时队列线程池模拟发送消息
- 4.3、通过http主动发送消息
- 5、🌟消息接收
- 5.1、不绑定消费组---可以实现广播📢效果
- 方式1:主动读取
- 测试日志
- 🍉方式2:通过监听器监听是否有新消息
- 5.2、指定消费组----实现一个组内只有一个成员可以接收到
- 5.2.1、配置类
- 5.2.2、监听器
- 通过延时队列发送到消息---测试结果:
- 通过http发送User到子类Book对象数据测试结果
- 三、完整代码
- 四、引用
背景:
使用该方式实现,主要是因为项目中有个地方刚好需要异步来实现,而项目又没有配置专业的消息中间件,并且使用的也不是太频繁,就觉得没必要专门安装一个MQ服务了,直接通过现有的redis的stream来实现异步消息接收直接具体的业务逻辑。
一、简介
1、介绍
Redis Stream(Redis Streams)是Redis 5.0版本引入的一种数据结构,用于处理时间序列数据、消息队列和日志流。它提供了高吞吐量、持久性、有序、可扩展的消息传递解决方案。Redis Stream 结构是对传统发布/订阅模式的增强,使你能够更灵活地处理数据流,并提供了以下主要特性:
多生产者和多消费者:多个生产者可以同时向 Stream 中写入消息,而多个消费者可以独立订阅并消费消息。每个消费者可以有不同的消费速率。
消费组:Redis Stream引入了消费者组的概念,多个消费者可以加入同一个消费者组并共同消费消息,这确保了消息在消费时不会被多次处理。
消费者阻塞:消费者可以使用 XREADGROUP 命令以阻塞方式获取消息,只有当有新消息到达时才会被推送给消费者。
消费者自动确认:Redis Stream 支持自动确认消息,消费者可以告诉 Redis 何时确认已经成功处理了一条消息。
多 Stream 支持:你可以创建多个 Stream 来存储不同种类的数据,并分别处理它们。
有序性:消息在 Stream 中按照消息的时间戳有序存储,因此你可以按照消息的顺序读取数据。
持久性存储:Redis Stream 使用内存数据结构,但也支持将数据异步保存到磁盘,以确保数据不会丢失。
2、对比
对比redis的其他几种实现方式来说功能更加全面,支持可持久化和通过ack确认的方式基本实现了消息丢失的问题,当然对比专业的消息队列中间件来说还是有些不足的。
需要看详细对比可以看 🔗redis队列对比 这篇文章

二、整合spring的data-redis实现
1、使用依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2、配置类
2.1、配置RedisTemplate bean
重点是下面这一句,不能用json的序列化类,否则会序列化失败
redisTemplate.setHashValueSerializer(RedisSerializer.string());
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 这个地方不可使用 json 序列化,如果使用的是ObjectRecord传输对象时,可能会有问题,会出现一个 java.lang.IllegalArgumentException: Value must not be null! 错误
redisTemplate.setHashValueSerializer(RedisSerializer.string());
return redisTemplate;
}
2.2、异常类
@Slf4j

本文介绍了如何在SpringBoot项目中整合SpringDataRedis来利用RedisStream的功能实现异步消息处理,包括配置、实体类、发送与接收消息的方式、消费组机制及测试结果。
最低0.47元/天 解锁文章
683

被折叠的 条评论
为什么被折叠?



