티스토리 뷰

2019/08/21 - [Programming & Solution/Java] - [SpringBoot] Redis 연계 (Lettuce)

 

[SpringBoot] Redis 연계 (Lettuce)

여기서는 Jedis가 아닌 Lettuce를 이용하여 연계를 했다. Lettuce는 Netty 기반의 Redis Client로 비동기로 요청을 처리하여 성능에 장점이 있어 사용했다. 일단 Jedis 기반처럼 Pool을 별도로 사용하지 않아도 돼..

godd.tistory.com

 

위 포스팅에 이어 단순 Set/Get이 아닌 Redis에서 제공해주는 Pub/Sub 기능도 사용해보도록 한다.

Redis는 단순히 key/value를 저장하는 Memory 기반의 DB여서 단순 분산 캐시로 많이 사용되지만

메세지 중개자로도 많이 사용이 된다.

 

pub/sub 패턴은 메세지를 전송하는 Publisher와 메세지를 구독하는 Subscriber가 있다.

(쉽게 생각하면 유튜브 구독하는거라고 생각하면 됩니다)

 

Publisher는 메세지를 전송해야 하고 Subscriber는 메세지를 받아야 하는데 

이를 위해서는 전송하고 받을 주소와 공간이 필요한데 이걸 Redis에서 제공해준다.

여기서 주소는 Channel이라고 표현한다.

 

Subscriber 추가

 

로거는 사용해도 되고 안사용해도 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class RedisMessageSubscriber implements MessageListener {
 
    static final Logger L = LoggerFactory.getLogger(RedisMessageSubscriber.class);
 
    @Override
    public void onMessage(Message message, byte[] bytes) {
        // message protocol : value1/value2
        L.debug("subscriber : message [{}]", message.toString());
        StringTokenizer st = new StringTokenizer(message.toString().replaceAll("\""""), "/");
        String value1 = st.nextToken();
        String value2 = st.nextToken();
        System.out.println(value1 + ", " + value2);
    }
}
 

보통 Publisher들이 보내는 Message들은 어떤 나름대로의 전문 형태가 있어서 메세지 형태의 Protocol을 대충 정의해서 사용했다. 아래 설정에서 추가 될 Channel을 Listening 하고 있는거라 해당 형태를 맞출 필요가 있다. 

 

※ 참고로 message 보낼때 제대로 된 값이 안들어가서 디버깅 해봤더니 message에 ""value1/value2"" 형태로 들어오고 있어서 쌍따옴표를 없애주고 Tokenizing을 했다. 이건 각 protocol을 어떻게 정의하냐에 따라 다를수도 있으니 저부분은 따로 수정바람

 

Redis 설정 추가

RedisConfig.java에 아래 설정 더 추가.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    @Value("${spring.redis.channel}")
    private String redisChannel;
    
    @Bean
    public MessageListenerAdapter messageListenerAdapter() {
        return new MessageListenerAdapter(new RedisMessageSubscriber());
    }
 
    @Bean
    public RedisMessageListenerContainer redisContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory());
        container.addMessageListener(messageListenerAdapter(), topic());
        return container;
    }
 
    @Bean
    public ChannelTopic topic() {
        return new ChannelTopic(redisChannel);
    }
 

Message Publish 사용

아주 간단쓰.
해당 channel에 publish 했으니 같은 host, 같은 port, 같은 channel을 구독하고 있는 인스턴스는 해당 메세지를 받아서 처리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
 
    @Autowired
    RedisTemplate<String, Object> redisTemplate;
    @Autowired
    Environment env;
 
    @Test
    public void redisPubSub_guide() {
        //protocol : value1/value2
        String message = "foo/bar";
        String channel = env.getProperty("spring.redis.channel");
        redisTemplate.convertAndSend(channel, message);
    }
}
 
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함