Backend/Redis

스프링부트에서 Redis 사용하기

olsohee 2024. 2. 17. 17:08

Redis와 직렬화/역직렬화

레디스의 데이터 저장 형식은 byte array 형태이며, 사용하는 쪽에서 포맷을 지정하여 저장 및 조회할 수 있다. Spring Data Redis는 자주 쓰는 포맷을 편리하게 사용할 수 있도록 미리 Serializer 클래스를 정의해뒀다. 

대표적인 Serializer 클래스를 살펴보자.

JdkSerializationRedisSerializer

디폴트 Serializer이며 다른 Serializer를 지정하지 않으면 기본으로 사용된다. JdkSerializationRedisSerializer가 사용되면 레디스에는 바이너리 형태로 데이터가 저장된다.

StringRedisSerializer

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());

 

위와 같이 설정하면 Key와 Value 모두 String 형태로 저장된다.

JacksonJsonRedisSerializer

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JacksonJsonRedisSerializer(User.class));

 

위와 같이 설정하면 Key는 String 형태로, Value는 json 형태로 저장된다.

RedisConnection, RedisConnectionFactory

RedisConnection은 RedisConnectionFactory를 통해 생성된다. IOC 컨테이너를 통해 RedisConnectionFactory에 적절한 connector를 설정하고 이를 주입받아서 사용하면 된다. RedisConnector에는 대표적으로 Lettuce와 Jedis가 있는데 나는 이 중 Lettuce를 사용했다.

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
    }
}

RedisTemplate 

RedisTemplate 등록

스프링에서 Redis를 사용하는 방법은 2가지이다.

  • RedisRepository
  • RedisTemplate

RedisConnection은 바이너리 형태의 데이터를 주고 받는데 RedisTemplate은 높은 수준의 추상화와 직렬화를 제공해주기 때문에 사용하기 편하다.

 

RedisConnectionFactory에 이어서 RedisTemplate도 빈으로 등록해주면 된다.

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
    }

    @Bean
    public RedisTemplate<String, byte[]> redisTemplate() {
        RedisTemplate<String, byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(RedisSerializer.byteArray());
        return redisTemplate;
    }
}

 

RedisTemplate 설정을 보면 key와 value에 대해 Serializer를 설정해주는 모습을 볼 수 있다. 나는 key는 String 타입, vlaue는 byte[] 형으로 지정할 것이기 때문에 위와 같이 등록해주었다. redisTemplate.setKeySerializer()를 설정해주지 않으면  "1"이란 key에 대해 value를 세팅해도 "1"이라는 key가 생성되지 않고 다음과 같은 key가 생성된다.

RedisTemplate으로 Redis에 값 저장하기

레디스에 값을 저장하려면 RedisTemplate으로부터 Operation을 가져와야 한다.

 

먼저 단순 value로 값을 저장하려면 redisTemplate.opsForValue() 메소드를 호출해서 ValueOperations를 가져온 후 값을 넣어주면 된다. 이는 단순 value이기 때문에 해당 key에는 딱 하나의 value만 저장할 수 있다.

ValueOperations<String, byte[]> valueOperations = redisTemplate.opsForValue();
valueOperations.set(..., ...);

 

만약 하나의 key에 여러 개의 value를 list 형태로 저장하고 싶으면 redisTemplate.opsForList() 메소드를 호출해서 ListOperations를 불러오면 된다.

ListOperations<String, byte[]> listOperations = redisTemplate.opsForList();
listOperations.leftPush(..., ...);

 

List외에도 Set, Hash 등의 타입이 존재한다.


Reference