Redis
공식문서
Redis 자바 가이드 (opens in a new tab)
Jedis 사용
JedisPool과 Jedis는 close()
를 호출해줘야 하는데, 아래와 같이 사용하면 try-with-resource
를 사용할 수 있다.
try (var jedisPool = new JedisPool("localhost", 6379)) {
try (var jedis = jedisPool.getResource()) {
}
}
Spring Session Data Redis
Session을 저장하게 되면 기본적으로 HttpSession
을 사용하는데, 이를 Redis
로 저장할 수 있다.
application.yaml에 다음과 같이 session: store-type
을 redis
로 설정하게 되면
spring:
session:
store-type: redis
아래 코드에서는 Redis에 저장하는 아무런 Code가 없지만 Redis에 Session이 저장된다.
@GetMapping("/")
public Map<String, String> home(HttpSession session) {
Integer visitCount = (Integer) session.getAttribute("visits");
if(visitCount == null) {
visitCount = 0;
}
session.setAttribute("visits", ++visitCount);
return Map.of("session id", session.getId(), "visits", visitCount.toString());
}
Pub / Sub
Redis를 Message Broker로 활용하는 기법을 의미한다. 서버가 꺼진 후 다시 연결이 되도 그 동안 발생한 메시지를 받을 수 없다는 특징이 있는다.
명령어
- publish key value : key에 value를 발행한다.
- subscribe key : key를 구독한다.
- pubsub channels : 현재 구독중인 채널을 확인한다.
- pubsub numsub key : key에 구독중인 클라이언트 수를 확인한다.
- psubscribe pattern : pattern을 구독한다.
Java Code
Config
RedisListners Config
@Configuration
public class RedisConfig {
@Bean
MessageListenerAdapter messageListenerAdapter() {
return new MessageListenerAdapter(new MessageListenService());
}
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter) {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
redisMessageListenerContainer.addMessageListener(messageListenerAdapter, ChannelTopic.of("users:unregistered"));
return redisMessageListenerContainer;
}
}
Listner Service
@Slf4j
@Service
public class MessageListenService implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
log.info("Received {} Channel", new String(message.getBody()), new String(message.getChannel()));
}
}
Publish
@RestController
@RequiredArgsConstructor
public class PublishController {
private final RedisTemplate<String, String> redisTemplate;
private final String key = "users:unregistered";
@GetMapping("events/user/deregistered/{userId}")
void publishUserDeregisteredEvent(@PathVariable String userId) {
redisTemplate.convertAndSend(key, userId);
}
}