728x90

 

Pub/Sub은 자주 사용되는 시스템 디자인 패턴 중 하나이다.
Redis는 메시지 브로커 역할을 하며, Publisher가 발행하는 메시지를 Subscriber에게 전달한다.

실시간 애플리케이션, 채팅 시스템, 알림 등을 빌드하기 위한 강력한 기능이다. 인메모리의 장점을 가지고 있어 빠른 처리가 가능하지만, 단점 또한 존재해 kafka등의 시스템을 사용하는 것도 고려해야 할 필요가 있다.

 

코드로 구현

@Service
@Slf4j
public class MessageListenerService implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
      log.info("Received Channel: {} Channel: {}" , new String(message.getChannel()), new String(message.getBody()));

    }
}

 

메세지를 받는 서비스를 MessageListener 인터페이스를 통해 Redis의 "chat" 채널에서 발생하는 메시지를 수신하고,
onMessage메서드를 통해 수신된 메시지와 채널 정보를 로깅하는 간단한 Pub/Sub 시스템을 구현했습니다.

 

@Component
public class RedisConfig {

    @Bean
    MessageListenerAdapter messageListenerAdapter() {
        return new MessageListenerAdapter(new MessageListenerService());
    }

    @Bean
    RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter listener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listener, ChannelTopic.of("chat"));
        return container;
    }

 

  • RedisConnectionFactory는 Redis와의 연결을 나타내는 Spring의 빈입니다.
  • MessageListenerAdapter는 실제 메시지를 처리할 리스너입니다.
  • ChannelTopic.of("chat")는 구독할 Redis 채널을 지정합니다. 위 코드에서는 "chat" 채널에 대한 리스너가 등록되어 있습니다.

API로 메시지 전달

@RestController
@RequiredArgsConstructor
public class PublishController {
    
    private final RedisTemplate<String, String> redisTemplate;
    
    @PostMapping("/publish")
    public void publish(String message) {
        redisTemplate.convertAndSend("chat", message);
    }
}

 

RedisTemplate을 주입받아 메시지를 발행하는 API를 구현했습니다.

'DB(MySQL, MongoDB, Redis, Kafka) > Redis' 카테고리의 다른 글

Spring Boot에서 Redis Cache 사용  (0) 2024.01.06
Redis 데이터 타입과 기본 명령어  (0) 2024.01.05
Redis 기본 개념  (1) 2024.01.05

+ Recent posts