JAVA/springboot
[java] API - redis cache
닉의네임
2023. 10. 9. 00:21
반응형
지난시간 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) {
자.. 테스트

뭐.. 당연히 예상했던 결과..
첫번째 테스트에서 country code 를 cache key로 데이터가 캐싱되었을것이고 두번째 테스트에서 redis 에 캐싱된 데이터를 사용하고 있있어 응답시간 7ms
다음 작업
redis 설정 다시하고
캐시 key를 어떻게 정의 할것인가..
반응형