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(redisConnectionFactory: RedisConnectionFactory): RedisCacheManager { val defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) .serializeValuesWith( RedisSerializationContext.SerializationPair.fromSerializer( GenericJackson2JsonRedisSerializer() ) ) val cacheConfigMap = mutableMapOf() cacheConfigMap["default"] = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) .serializeValuesWith( RedisSerializationContext.SerializationPair.fromSerializer( GenericJackson2JsonRedisSerializer() ) ) cacheConfigMap["cache_ttl_3_days"] = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofDays(3)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer())) .serializeValuesWith( RedisSerializationContext.SerializationPair.fromSerializer( GenericJackson2JsonRedisSerializer() ) ) return RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(defaultCacheConfig) .withInitialCacheConfigurations(cacheConfigMap) .build() } }