본문 바로가기
데이터베이스

Redis Spring에서 사용 정리

by so5663 2024. 3. 13.

프로젝트를 하면서 redis를 사용하였는데 그걸 정리 하였습니다.

RedisConfig.java

import com.group.Bmart.domain.item.service.response.ItemRedisDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@EnableCaching 
@Configuration
public class RedisConfig {

    // application.yml에 등록된 정보를 가져왔습니다.
    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    // serializer 설정으로 redis-cli를 통해 직접 데이터를 조회할 수 있도록 설정
    @Bean
    public RedisTemplate<String, Long> stringToLongRedisTemplate() {
        RedisTemplate<String, Long> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericToStringSerializer<>(Long.class));
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    public ListOperations<String, String> listOperations(
        RedisTemplate<String, String> redisStringTemplate) {
        return redisStringTemplate.opsForList();
    }

    @Bean
    public RedisTemplate<String, ItemRedisDto> itemRedisDtoRedisTemplate() {
        RedisTemplate<String, ItemRedisDto> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(ItemRedisDto.class));
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

 

@EnableCaching

어노테이션을 사용하여 캐싱 기능을 활성화할 수 있습니다.

 

redisConnectionFactory

redisConnectionFactory() 메서드는 LettuceConnectionFactory를 사용하여 Redis 연결 팩토리를 생성합니다.

 

listOperations

listOperations() 메서드는 RedisTemplate<String, String>을 사용하여 Redis 리스트를 조작하는 ListOperations<String, String> 인터페이스를 반환합니다. 이를 통해 Redis 리스트에 데이터를 추가하고 조회할 수 있습니다.

 

itemRedisDtoRedisTemplate

itemRedisDtoRedisTemplate() 메서드는 RedisTemplate<String, ItemRedisDto>를 생성하고, 이를 사용하여 ItemRedisDto 객체를 직렬화하여 Redis에 저장합니다. 이를 위해 StringRedisSerializer Jackson2JsonRedisSerializer를 사용합니다. 전자는 문자열을 직렬화하고 역직렬화하기 위한 것이고, 후자는 Jackson을 사용하여 객체를 JSON 형식으로 직렬화하고 역직렬화합니다.

 

 실제 비즈니스 로직

package com.group.Bmart.domain.item.service;

import com.group.Bmart.domain.item.service.response.ItemRedisDto;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;

@Service
@RequiredArgsConstructor
public class ItemCacheService {

    private final RedisTemplate<String, ItemRedisDto> redisTemplate;
    private static final String NEW_PRODUCTS_KEY = "new_products";

    // 새로운 상품 정보를 Redis에 저장하는 메서드
    public void saveNewItem(final ItemRedisDto itemRedisDto) {
        redisTemplate.opsForList().rightPush(NEW_PRODUCTS_KEY, itemRedisDto);
    }

    // Redis에서 저장된 모든 새로운 상품 정보를 가져오는 메서드
    public List<ItemRedisDto> getNewItems() {
        ListOperations<String, ItemRedisDto> listOperations = redisTemplate.opsForList();
        Long itemCount = listOperations.size(NEW_PRODUCTS_KEY);
        if (itemCount == null || itemCount == 0) {
            return null; // 저장된 상품 정보가 없을 경우 null 반환
        }

        return listOperations.range(NEW_PRODUCTS_KEY, 0, -1); // 모든 상품 정보를 리스트 형태로 반환
    }
}

 

private final RedisTemplate<String, ItemRedisDto> redisTemplate 을 활용한다.