Server/Spring

[Spring] Spring Data Redis로 자료구조 사용해보기

백엔드 규니 2021. 8. 10. 22:59
728x90
반응형

Spring Data Redis로 자료구조 다루어 보기

Redis 는 간단하게 말하면 Key-Value 형태의 영속성을 지원하는 인메모리 데이터 저장소입니다. 이번 글에서는 Spring Data Redis를 활용해서 List, Set, Sorted Set, Map을 사용해서 데이터를 저장하고 조회하는 것에 대해서 정리해보겠습니다.

 

먼저 Spring Boot gradle 기반의 프로젝트에서 의존성 부터 추가해서 시작해보겠습니다.

 

gradle

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

위의 Spring-data-redis 의존성을 추가하겠습니다. 이제 Redis 설정을 해보겠습니다.



Redis 설정

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();  // Lettuce 사용
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); 
        redisTemplate.setConnectionFactory(redisConnectionFactory());  
        redisTemplate.setKeySerializer(new StringRedisSerializer());   // Key: String 
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(String.class));  // Value: 직렬화에 사용할 Object 사용하기   
        return redisTemplate;
    }

}

먼저 RedisConnectionFactory 인터페이스 하위 클래스에는 LettuceConnectionFactory, JedisConnectionFactory 두 가지가 존재합니다. LettuceJedis 둘 다 정말 유명한 것이지만 Jedis 보단 Lettuce를 쓰자 의 글을 보면 Lettuce의 성능이 좀 더 좋은 것을 볼 수 있기에 저는 Lettuce를 사용하겠습니다.

 

그리고 다음에 RedisTemplate이 나오는데요. RedisTemplate은 Redis 서버에 Redis 커맨드를 수행하기 위한 high-level-abstractions을 제공합니다. 또한 Object 직렬화, Connection management를 수행합니다.
또한 Redis 서버에 데이터 CRUD를 위해, Redis의 다섯가지 데이터 유형에 대한 Operation Interface를 제공합니다.

메소드명 반환 오퍼레이션 Redis 자료구조
opsForValue() ValueOperations String
opsForList() ListOperations List
opsForSet() SetOperations Set
opsForZSet() ZSetOperations Sorted Set
opsForHash() HashOperations Hash
  • RedisTemplate: RedisTemplate은 Thread-Safe 하며 재사용이 가능합니다.
  • JacksonJsonSerializer: JSON 포맷으로 데이터를 저장하는 경우

 

이렇게 RedisTemplate과 이것을 사용하기 위한 Operation Interface들에 대하여 알아보았습니다. 이제 실제로 List, Set, Sorted Set, Hash를 Redis에 저장하는 것을 코드로 예제를 진행해보겠습니다.



Redis List Type 예제

private final RedisTemplate<String, Object> redisTemplate;

redisTemplate.opsForList().rightPush("key", "value");
RedisOperations<String, Object> operations = redisTemplate.opsForList().getOperations();
System.out.println(operations.opsForList().range("chatNumber" + idx, 0, -1));  // Redis Data List 출력

위와 같이 Redis에 Key: List 형태로 저장을 할 수 있습니다. 그리고 range 메소드를 통해서 List의 Start, end 인덱스를 통하여 가져올 수도 있습니다.



Redis Set Type 예제

private final RedisTemplate<String, Object> redisTemplate;

SetOperations<String, Object> setOperations = redisTemplate.opsForSet();
setOperations.add("Key", chatMessage);
System.out.println(setOperations.pop("Key"));       // 하나 꺼내기
System.out.println(setOperations.members("Key"));  // 전체 조회

Set은 add, pop 메소드를 사용하여 저장, 조회를 합니다.



Redis Sorted Set Type 예제

private final RedisTemplate<String, Object> redisTemplate;

ZSetOperations<String, Object> zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("Key", "Value", score);
System.out.println(zSetOperations.range("ZKey", 0, -1));

위와 같이 Sorted Set도 손 쉽게 사용할 수 있습니다.



Redis Hash Type 예제

메모리 공간을 작게 차지함으로, 수백만개의 오브젝트를 하나의 Redis 인스턴스에 저장 가능합니다.

HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
Map<String, Object> map = new HashMap<>();
map.put("firstName", "Gyunny");
map.put("lastName", "Choi");
map.put("gender", "Man");
hashOperations.putAll("key", map);

String firstName = (String) redisTemplate.opsForHash().get("key", "firstName");
String lastName = (String) redisTemplate.opsForHash().get("key", "lastName");
String gender = (String) redisTemplate.opsForHash().get("key", "gender");
System.out.println(firstName);
System.out.println(lastName);
System.out.println(gender);

이렇게 Redis의 여러 가지 자료구조를 사용하여 데이터를 저장하고 조회하는 기능들에 살펴보았습니다.

반응형