aws elastiCache 의 생성된 redis 정보를 보니, replica가 있었다. 그래서 읽기는 replica 에서 하도록 설정을 해보려고 한다.
spring:
redis:
master:
host: localhost
port: 6379
slave:
host: localhost
port: # replica port
사실 로컬에서도 replica 서버를 띄워서 테스트 해보고 싶었으나, redis.conf 변경하여 적용하는게 잘 안되서 실제로 테스트는 elastiCache 에서 했다.
@Configuration
@EnableCaching
class RedisCacheConfig(
@Value("\${spring.redis.master.host}")
private val masterHost: String,
@Value("\${spring.redis.master.port}")
private val masterPort: Int,
@Value("\${spring.redis.slave.host}")
private val slaveHost: String,
@Value("\${spring.redis.slave.port}")
private val slavePort: Int
) {
@Bean
fun redisConnectionFactory(): RedisConnectionFactory {
val clientConfig = LettuceClientConfiguration.builder()
.readFrom(ReadFrom.REPLICA_PREFERRED)
.build()
val masterSlaveConfig: RedisStaticMasterReplicaConfiguration = RedisStaticMasterReplicaConfiguration(masterHost, masterPort)
.apply { this.addNode(slaveHost, slavePort) }
return LettuceConnectionFactory(masterSlaveConfig, clientConfig)
}
@Bean
fun cacheManager(): CacheManager {
val objectMapper = ObjectMapper()
.registerModule(JavaTimeModule())
.activateDefaultTyping(BasicPolymorphicTypeValidator.builder()
.allowIfBaseType(Any::class.java).build(), ObjectMapper.DefaultTyping.EVERYTHING)
val redisCacheConfiguration: RedisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(GenericJackson2JsonRedisSerializer(objectMapper)))
.entryTtl(Duration.ofMinutes(3L))
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory())
.cacheDefaults(redisCacheConfiguration).build()
}
}
기존 구현부에서 redisConnectionFactory() 구현부만 변경되었다.
참고
https://blog.leocat.kr/notes/2021/08/10/redis-read-from-replica