아빠는 개발자

[java] API - redis cache 본문

Java/API

[java] API - redis cache

father6019 2023. 10. 8. 02:31
728x90
반응형

지난시간 elasticsearch 의 file system cache 를 사용해서 성능을 올려보았는데 

https://father-lys.tistory.com/40

 

[java] API - file system cache (request cache)

API 를 만들고 응답시간을 측정해서 최적의 성능을 만들어 보자 일단 제물이 될 index 820만건의 location-index 일단 aqqle 의 shop API 를 응용해서 후다닥 만들어 보자. 복붙해서 이름만 바꾸니까 1분 미

father-lys.tistory.com

캐싱하면 redis 니까 함 넣어보잣

 

우선 redis 설치

https://father-lys.tistory.com/41

 

그리고

aqqle api 에 redis 설정

 

1. build.gradle 에 dependencies 추가 

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

2. RedisConfig 생성

package com.doo.aqqle.config;

import com.doo.aqqle.common.CacheKey;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.CacheKeyPrefix;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

@RequiredArgsConstructor
@EnableCaching
@Configuration
public class RedisConfig {

    @Bean(name = "cacheManager")
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {

        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .disableCachingNullValues()
                .entryTtl(Duration.ofSeconds(CacheKey.DEFAULT_EXPIRE_SEC))
                .computePrefixWith(CacheKeyPrefix.simple())
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));

        Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
        cacheConfigurations.put(CacheKey.LOCATION, RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(CacheKey.DEFAULT_EXPIRE_SEC)));
     

        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory).cacheDefaults(configuration)
                .withInitialCacheConfigurations(cacheConfigurations).build();
    }
}

3. 캐시 key 정보 

package com.doo.aqqle.common;

public class CacheKey {

    public static final int DEFAULT_EXPIRE_SEC = 60; // 1 minutes
    public static final String LOCATION = "location";
}

3. response model 직렬화 

package com.doo.aqqle.model;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.List;

@Getter
@Setter
public class ListResult<T> extends CommonResult implements Serializable {
    private List<T> list;
}

4. 데이터를 처리하는 메소드 캐싱 


@Cacheable(value = CacheKey.LOCATION, key = "#countryCode", unless = "#result == null")
public CommonResult getLocations(String countryCode) {

자.. 테스트

API 평균 : 53.26
97456
API 평균 : 7.11
31056
API 평균 : 7.1
31056

뭐.. 당연히 예상했던 결과.. 

첫번째 테스트에서 country code 를 cache key로 데이터가 캐싱되었을것이고 두번째 테스트에서 redis 에 캐싱된 데이터를 사용하고 있있어 응답시간 7ms 

 

다음 작업

redis 설정 다시하고

캐시 key를 어떻게 정의 할것인가..

 

 

728x90
반응형