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}") private val host: String, @Value("\${spring.redis.port}") private val port: Int ) { @Bean fun redisConnectionFactory(): RedisConnectionFactory { return LettuceConnectionFactory(host, port) } @Bean fun redisTemplate(): RedisTemplate<*, *> { val redisTemplate: RedisTemplate<*, *> = RedisTemplate() redisTemplate.setConnectionFactory(redisConnectionFactory()) return redisTemplate } @Bean fun cacheManager(connectionFactory: RedisConnectionFactory): RedisCacheManager { val defaultConfig = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)) // Default TTL .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) .serializeValuesWith( RedisSerializationContext.SerializationPair.fromSerializer( GenericJackson2JsonRedisSerializer() ) ) val weekLivedCacheConfig = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofDays(3)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) .serializeValuesWith( RedisSerializationContext.SerializationPair.fromSerializer( GenericJackson2JsonRedisSerializer() ) ) return RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(connectionFactory) .cacheDefaults(defaultConfig) .withCacheConfiguration("weekLivedCache", weekLivedCacheConfig) .build() } }