Redis - Can't start Redis Server

DDANDARA ㅣ 2020. 9. 20. 23:24

대부분의 경우 잘못된 환경 2가지로 인해 나타난다.

1. redis로 사용하려는 port가 이미 서버나 로컬 상에서 사용 중일 때

- redis의 default port가 6379이다. 이 경우는 로컬에 레디스를 설치하여 사용하다 embedded redis를 사용하는 경우 나타난다. 로컬 redis의 서비스를 중지한 뒤 실행하면 해결된다.

-- Window:

[윈도우] - [서비스] 에서 로컬에서 실행되고 있는 redis를 중지시킨다.

-- Linux:

/etc/init.d/redis-server stop

-- Mac:

redis-cli shutdown

2. redis config상에서의 문제

- 에러 로그에 따르면 maxheap이나 maxmemory setting을 설정해주지 않아 발생할 수 있다.

[9520] 03 Jun 18:12:27.054 # The Windows version of Redis allocates a memory mapped heap for sharing with the forked process used for persistence operations. In order to share this memory, Windows allocates from the system paging file a portion equal to the size of the Redis heap. 

At this time there is insufficient contiguous free space available in the system paging file for this operation (Windows error 0x5AF). 

To work around this you may either increase the size of the system paging file, or decrease the size of the Redis heap with the --maxheap flag. 

Sometimes a reboot will defragment the system paging file sufficiently for this operation to complete successfully. Please see the documentation included with the binary distributions for more details on the --maxheap flag.

-- redis 서버 실행 시 maxheap 옵션을 추가해 준다.

redis-server --maxheap 128mb

-- Java에서 embeded-redis 설정 시 maxheap을 설정하여 해결할 수 있다

// Windows 64-bit
@Configuration
@Profile("test")
public class EmbeddedRedisServer {

    @Value("${spring.redis.port:6380}")
    private int redisPort;

    private RedisServer redisServer;

    @PostConstruct
    public void startRedis() throws IOException, URISyntaxException {
        //redisPort = org.springframework.util.SocketUtils.findAvailableTcpPort(6380);
        //RedisExecProvider customRedisExec = RedisExecProvider.defaultProvider().override
        //        (OsArchitecture.detect().os(), OsArchitecture.detect().arch(), "redis-server-2.8.19.exe");

        redisServer = RedisServer.builder()
                .port(redisPort)
                //.redisExecProvider(customRedisExec) //com.github.kstyrc (not com.orange.redis-embedded)
                .setting("maxmemory 128M") //maxheap 128M
                .build();
        redisServer.start();
    }

    @PreDestroy
    public void stopRedis() throws InterruptedException {
        if (redisServer != null) {
            redisServer.stop();
        }
    }
}

https://github.com/kstyrc/embedded-redis/issues/51을 참고하여 설정하자.