步骤1:配置 Spring Data Redis
spring:
redis:
host: localhost # Redis 服务器的主机名或 IP 地址
port: 6379 # Redis 服务器的端口
步骤2:创建 Redis 配置类
创建一个 Redis 配置类,用于配置 Redis 连接工厂和 RedisTemplate。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
// 设置其他序列化器或配置根据需要
return template;
}
}
步骤3:发布消息
在服务或控制器中,可以注入 RedisTemplate 并使用 convertAndSend 方法来发布消息。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class MessageService {
private final RedisTemplate<String, Object> redisTemplate;
@Autowired
public MessageService(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void publishMessage(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}
}
步骤4:订阅消息
要订阅消息,需要创建一个 Redis订阅器 或者说是 redis消息监听器
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
public class MyMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String channel = new String(message.getChannel());
String msgBody = new String(message.getBody());
System.out.println("Received message from channel " + channel + ": " + msgBody);
// 在这里处理接收到的消息
}
}
步骤5:配置消息订阅器
将这个监听器注册到 Redis 消息监听容器中,并指定要订阅的频道。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@Configuration
public class RedisListenerConfig {
private final RedisConnectionFactory connectionFactory;
private final MyMessageListener messageListener;
public RedisListenerConfig(
RedisConnectionFactory connectionFactory,
MyMessageListener messageListener) {
this.connectionFactory = connectionFactory;
this.messageListener = messageListener;
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(messageListener, new ChannelTopic("your-channel"));
// 可以添加多个监听器和频道
return container;
}
}
步骤6:测试发布和订阅
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisMessageTest {
@Autowired
private MessageService messageService;
@Test
public void testPublishAndSubscribe() throws InterruptedException {
String channel = "your-channel";
String message = "Hello, Redis!";
// 发布消息
messageService.publishMessage(channel, message);
// 等待一段时间以确保消息被处理
Thread.sleep(1000);
}
}
##问题
一.redisTemplate.convertAndSend(channel, message); 发布消息之后,客户端A消费消息,客户端B还能消费消息吗?
可以的。Redis内部通过维护一个消息订阅/发布系统来实现这一功能。当一个客户端使用PUBLISH命令(或convertAndSend等Redis客户端库的对应方法)发布一条消息到指定的频道时,Redis会将该消息发送到所有已订阅该频道的客户端。
流程如下:
1.客户端订阅频道: 客户端A和客户端B分别发送SUBSCRIBE channel命令,其中channel是他们要订阅的频道名。
2.消息发布: 当某个客户端(例如,客户端C)发送PUBLISH channel message命令时,Redis会将message消息发送给所有已经订阅了channel频道的客户端A和客户端B。
3.消息传递: Redis维护一个消息队列,将消息传递给已订阅的客户端。这意味着消息是按照它们被发布的顺序传递给订阅者的。
4.客户端消费消息: 客户端A和客户端B接收到消息并进行相应的处理。
redis如何实现发布订阅的消息队列功能?
于 2023-09-06 00:13:15 首次发布