2025. 2. 27. 21:02ㆍDB/NoSQL
📝 Redis를 다루며 만났던 에러들이 있었기에, 대응 방법을 까먹지 않기 위해 글을 작성하고자 합니다.
😭Error : RedisCommandTimeoutException
SpringBoot 프로젝트에서 대량으로 저장된 데이터를 Lua script를 이용하여 삭제하는 과정이 있었습니다. 해당 과정에서 발생하는 에러는 다음과 같습니다.
Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException:
Command timed out after 1 minute(s)
😂원인
이 에러는 Lettuce 클라이언트를 사용하여 Redis 에 요청을 보냈는데, 지정된 시간(1 min)이 지나도록 응답을 받지 못해서 발생하는 에러입니다. 에러의 원인이 하나일 수도 있고, 반대로 여러 원인이 복합적으로 발생하여 에러를 만들어낼 수도 있습니다.
저의 경우, 이 에러의 원인은 RedisConnectionFactory의 설정 중 timeout 값이 너무 짧았습니다. 당시 Lua script를 이용하여 데이터를 삭제할 때 발생했는데요. 다만 삭제해야 할 데이터가 엄청 많다보니, 삭제 시간이 1분으로는 너무나도 부족했었습니다. (실제로 확인된 삭제 시간만 약 3분..)
📝해결
application.properties(또는 yml) 설정을 추가해도 되고, 설정에서 bean으로 관리를 해도 됩니다!! 저의 경우는 @Configuration에 @Bean으로 관리하기로 했습니다.
1. application.properties 수정
spring.redis.timeout=60000 #단위: ms (기본 설정 : 1초)
2. LettuceClientConfiguration 수정
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("localhost", 6379);
SocketOptions socketOptions = SocketOptions.builder()
.connectTimeout(Duration.ofSeconds(10))
.build();
ClientOptions clientOptions = ClientOptions.builder()
.socketOptions(socketOptions)
.build();
LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
.commandTimeout(Duration.ofSeconds(300)) // RedisCommandTimeoutException 해결 위해 추가
.clientOptions(clientOptions)
.build();
return new LettuceConnectionFactory(serverConfig, clientConfig);
}
}
약 5분으로 설정을 바꿨더니.. 이제는 해당 에러가 발생하지 않음을 확인했습니다!!
References