Spring - M1 맥북에서 Embeded Redis 사용하기

목차

참고

M1 Mac 에서 Embedded Redis 사용시 에러

M1 맥북에서 Embedded Redis 를 그냥 사용하려고 하면 다음과 같이 redis server 를 시작할 수 없다는 에러가 발생합니다.

Caused by: java.lang.RuntimeException: Can't start redis server. Check logs for details. Redis process log: 
at redis.embedded.AbstractRedisInstance.awaitRedisServerReady(AbstractRedisInstance.java:70) ~[embedded-redis-0.7.3.jar:na]
at redis.embedded.AbstractRedisInstance.start(AbstractRedisInstance.java:42) ~[embedded-redis-0.7.3.jar:na]

Embedded Redis 라이브러리 확인

Embedded Redis 라이브러리에서 제공해주는 Redis 아키택처 정보들을 확인하면 M1 맥북에 해당하는 aarch64 용 Redis 를 지원하지 않습니다. 따라서, M1 에서 Embedded Redis 를 사용하기 위해서는 M1 용 아키택처에 맞게 Redis 를 새롭게 빌드해서 Embedded Redis 라이브러리가 띄울 수 있게 제공해야 합니다.

// 1) given explicit file (os-independence broken!)
RedisServer redisServer = new RedisServer("/path/to/your/redis", 6379);

// 2) given os-independent matrix
RedisExecProvider customProvider = RedisExecProvider.defaultProvider()
.override(OS.UNIX, "/path/to/unix/redis")
.override(OS.WINDOWS, Architecture.x86, "/path/to/windows/redis")
.override(OS.Windows, Architecture.x86_64, "/path/to/windows/redis")
.override(OS.MAC_OS_X, Architecture.x86, "/path/to/macosx/redis")
.override(OS.MAC_OS_X, Architecture.x86_64, "/path/to/macosx/redis")

RedisServer redisServer = new RedisServer(customProvider, 6379);

M1 용 Redis Server 생성

Redis 공식 문서에서는 Redis 소스를 제공합니다. 최신 버전에 해당하는 Redis 를 내려받아 M1 맥북에 맞게 소스를 빌드해줍니다.

// Redis 소스를 내려받고 빌드를 폴더 정의
mkdir -p src/main/resources/binary/redis
// 다운로드 폴더로 이동
cd src/main/resources/binary/redis
// 소스 코드 다운로드
wget https://download.redis.io/releases/redis-7.0.15.tar.gz
// 압축 해제
tar xzf redis-7.0.15.tar.gz
// redis-7.0.15 디렉토리 이동
cd redis-7.0.15
// Redis 빌드를 진행
make

make 명령어를 통해 빌드를 진행하면 src 폴더에 redis-server 가 생성됩니다. 생성된 redis-server 를 사용하기 쉽게 resource/binary/redis 폴더로 옮겨줍니다.

Embeded Redis 사용하기위한 설정

binary/redis 경로에 M1 아키텍처로 새롭게 빌드된 redis-server 를 RedisServer 에 넘겨주면 어플레케이션이 문제 없이 실행되는 것을 확인할 수 있습니다.

@Configuration
@Profile("local")
@Slf4j
public class EmbeddedRedisConfig {

private int port = 6379;
private RedisServer redisServer;

@PostConstruct
public void redisServer() throws Exception {
log.info("System OS: {}", System.getProperty("os.name"));
log.info("System Architecture: {}", System.getProperty("os.arch"));

if (isMacM1()) {
log.info("Mac OS ARM Architecture");
redisServer = new RedisServer(getRedisFileForArcMac(), port);
}else {
redisServer = new RedisServer(port);
}

redisServer.start();
}

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

private boolean isMacM1() {
if (!System.getProperty("os.name").equals("Mac OS X")) {
return false;
}

return System.getProperty("os.arch").equals("aarch64");
}

private File getRedisFileForArcMac() throws Exception {
try {
return new ClassPathResource("binary/redis/redis-server").getFile();
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
}
Share