티스토리 뷰
2019/08/21 - [Programming & Solution/Java] - [SpringBoot] Redis 연계 (Lettuce)
위 포스팅에 이어 단순 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";
redisTemplate.convertAndSend(channel, message);
}
}
|
'Programming & Solution > Java' 카테고리의 다른 글
[SpringBoot] https / http2 적용 (0) | 2020.04.21 |
---|---|
[SpringBoot] CP Connection 이슈 트러블슈팅 (0) | 2020.03.10 |
[SpringSecurity] URL 더블슬래시 허용 (1) | 2019.08.28 |
[SpringBoot] OAUTH2 설정 (0) | 2019.08.22 |
[SpringBoot] Redis 연계 (Lettuce) (0) | 2019.08.21 |
- Total
- Today
- Yesterday
- vuejs
- 아키텍처
- 동적계획법
- SpringBoot
- white paper
- Vue.js
- CARDANO
- 사토시 나가모토
- architecture
- 비트코인
- kubernetes
- 백준
- 스프링
- Bitcoin
- Bruteforce
- 카르다노
- 알고리즘
- Blockchain
- excel parsing
- 암호화폐
- leetcode
- Java
- 스프링 시큐리티
- Redis
- Spring
- Nealford
- gRPC
- DP
- k8s
- 블록체인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |