Spring
API
Redis

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-typeredis로 설정하게 되면

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);
  }
}

Reference

https://bcp0109.tistory.com/328 (opens in a new tab)