[Error/Redis] RedisCommandTimeoutException

2025. 2. 27. 21:02DB/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

1. Redis - Lettuce 설정

2. Spring Data Redis - Auto Configuration을 이용한 Redis 연결 설정