본문 바로가기
프레임워크/스프링

[Redis] MongoDB와 Redis를 사용하여 Molon차트 저장하기 (1)

by Yikanghee 2022. 5. 8.

캐시 DB는 데이터의 빠른 출력을 위해 메모리에 저장하는 데이터베이스로 RedisDB를 많이 활용한다

 

오늘 해본것은 멜론 차트 100을 수집한 내용을 RedisDB에 일정시간동안 저장하고,

조회 요청이 발생하면 RedisDB에서 데이터를 가져오고, 만약 RedisDB에 데이터가 없다면, MongoDB에서 가져온다

 

우선 Interface Mapper 부터 생성해준다

주석에 설명을 적어놔서 설명은 생략하겠다

/**
     * 멜론 노래 리스트 저장하기
     *
     * @param pList 저장할 데이터
     * @return 저장 결과
     */
    int insertSong(List<MelonDTO> pList, String redisKey) throws Exception;

    /**
     * 멜론 노래 키 정보 존재여부 체크하기
     *
     * @param key 저장된 키 이름
     * @return key존재여부
     */
    boolean getExistKey(String redisKey) throws Exception;

    /**
     * 오늘 수집된 멜론 노래리스트 가져오기
     *
     * @param key 저장된 키 이름
     * @return 노래 리스트
     */
    List<MelonDTO> getSongList(String redisKey) throws Exception;

다음으로는 Mapper 로직을 작성해준다

RedisTemplate 를 @Autowired 해줘도 되는데 Spring Boot에서 생성자를 직접 입력하는 것을 권장한다

insertSong에서는 값을 저장하는 로직을 담당하고, getExist 에서는 저장된 키가 존재하는지 확인한다

getSongList에서는 값을 조회하는 역할을 한다

Redis에서는 유효기한을 정해서 값을 날려버리기 때문에 이러한 로직이 필요하다

@Slf4j
@Component("MelonCacheMapper")
public class MelonCacheMapper implements IMelonCacheMapper {

    public RedisTemplate<String, Object> redisDB;

    public MelonCacheMapper(RedisTemplate<String, Object> redisDB) {
        this.redisDB = redisDB;
    }

    @Override
    public int insertSong(List<MelonDTO> pList, String redisKey) throws Exception {

        log.info(this.getClass().getName() + ".insertSong Start!");

        int res = 0;

        String key = "MELON_" + DateUtil.getDateTime("yyyyMMdd");

        redisDB.setKeySerializer(new StringRedisSerializer());
        redisDB.setValueSerializer(new Jackson2JsonRedisSerializer<>(MelonDTO.class));

        // 람다식으로 데이터 저장하기
        pList.forEach(melon -> redisDB.opsForList().leftPush(key, melon));

        // 저장한 데이터는 1시간동안 보관하기
        redisDB.expire(key, 1, TimeUnit.HOURS);

        res = 1;

        log.info(this.getClass().getName() + ".insertSong End!");

        return res;
    }

    @Override
    public boolean getExistKey(String key) throws Exception {

        // 저장된 키가 존재한다면...
        if (redisDB.hasKey(key)) {
            return true;

        }{
            return false;

        }
    }

    @Override
    public List<MelonDTO> getSongList(String key) throws Exception {

        log.info(this.getClass().getName() + ".getSongList Start!");

        redisDB.setKeySerializer(new StringRedisSerializer());
        redisDB.setValueSerializer(new Jackson2JsonRedisSerializer<>(MelonDTO.class));

        List<MelonDTO> rList = null;

        // 저장된 키가 존재한다면...
        if (redisDB.hasKey(key)) {
            rList = (List) redisDB.opsForList().range(key, 0, -1);
        }

        log.info(this.getClass().getName() + ".getSongList End!");

        return rList;
    }
}

 

Service와 Controller는 다음 게시물...

댓글