diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 22480ee..0ec3965 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -1,14 +1,22 @@ package kr.co.vividnext.sodalive.configs 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.cache.RedisCacheConfiguration +import org.springframework.data.redis.cache.RedisCacheManager import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.repository.configuration.EnableRedisRepositories +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer +import org.springframework.data.redis.serializer.RedisSerializationContext +import org.springframework.data.redis.serializer.StringRedisSerializer +import java.time.Duration @Configuration +@EnableCaching @EnableRedisRepositories class RedisConfig( @Value("\${spring.redis.host}") @@ -27,4 +35,31 @@ class RedisConfig( redisTemplate.setConnectionFactory(redisConnectionFactory()) return redisTemplate } + + @Bean + fun cacheManager(connectionFactory: RedisConnectionFactory): RedisCacheManager { + val defaultConfig = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(10)) // Default TTL + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + + val weekLivedCacheConfig = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofDays(7)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + GenericJackson2JsonRedisSerializer() + ) + ) + + return RedisCacheManager.RedisCacheManagerBuilder + .fromConnectionFactory(connectionFactory) + .cacheDefaults(defaultConfig) + .withCacheConfiguration("weekLivedCache", weekLivedCacheConfig) + .build() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index 038f732..08ef606 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -18,6 +18,7 @@ import kr.co.vividnext.sodalive.content.order.QOrder.order import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme import kr.co.vividnext.sodalive.event.QEvent.event import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.cache.annotation.Cacheable import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.time.LocalDateTime @@ -387,6 +388,11 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .fetch() } + @Cacheable( + value = ["getAudioContentCurations"], + key = "#isAdult", + cacheManager = "cacheManager" + ) override fun getAudioContentCurations(isAdult: Boolean): List { var where = audioContentCuration.isActive.isTrue @@ -438,6 +444,11 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .fetch() } + @Cacheable( + value = ["weekLivedCache"], + key = "#startDate" + '_' + "#isAdult" + '_' + "#offset" + '_' + "#limit", + cacheManager = "cacheManager" + ) override fun getAudioContentRanking( cloudfrontHost: String, isAdult: Boolean, diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4dd8bb8..3be6e79 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -73,6 +73,8 @@ spring: multipart: max-file-size: 1024MB max-request-size: 1024MB + cache: + type: redis --- spring: config: diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index c831d44..6639ad7 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -47,3 +47,5 @@ spring: hibernate: show_sql: true format_sql: true + cache: + type: redis