kstyrc / embedded-redis

Redis embedded server for Java integration testing
832 stars 366 forks source link

can not start for mac, #127

Open cayden-cheng opened 2 years ago

cayden-cheng commented 2 years ago

can not start for mac os version: mac os big sur 11.4 but when start in mac os catalina is ok。 is this the problem with m1 cpu or mac os ?

lahmXu commented 2 years ago

+1

ruipeng110 commented 2 years ago

+1

cayden-cheng commented 2 years ago

I think it's a big sur system problem, please give up embedded-redis, try using brew to install redis

idontusenumbers commented 2 years ago

Seems the embedded redis binary isn't m1 and doesn't work with rosetta

cayden-cheng commented 2 years ago

do you want say apple's arm64??

idontusenumbers commented 2 years ago

Apple M1 runs Mach-O 64-bit executable arm64 natively, yes.

cayden-cheng commented 2 years ago

just want say,the apple m1 is terrible,just like bull shit....hope the laste version can be change it

mmazurovsky commented 2 years ago

Hello! This package ships with outdated Redis version that does not have support for Apple Silicon (M1). As can be seen from here, only Redis 6.0+ supports Apple Silicon.

So here is what you need to do to make embedded redis working:

  1. Follow the instruction, download and build Redis that supports Apple Silicon.
  2. Open the Redis directory, open src directory, find redis-server and get its absolute path, for example mine is "/Users/username/Code/Redis/redis-6.2.6/src/redis-server".
  3. In your code you will need to use the Redis executable that you have just obtained. For that create RedisExecProvider object and override redis executable that is used by default for the macOS: private val customRedisProvider: RedisExecProvider = RedisExecProvider.defaultProvider().override(OS.MAC_OS_X, Architecture.x86_64, "obtained/path/to/your/redis").override(OS.MAC_OS_X, Architecture.x86, "obtained/path/to/your/redis")
  4. Create RedisServer object with the RedisExecProvider you created previously. private val redisServer = RedisServer(customRedisProvider, redisPort)
  5. Just do redisServer.start(). This way you don't need to do additional setup for the Unix server as it will still use default Redis, not the one with Apple Silicon support. Hope this helps.
idontusenumbers commented 2 years ago

I moved to using a TestContainer which can pull the docker image that has all architectures.

HyunAh-iia commented 2 years ago

Update your Mac OS Bigsur to Monterey

Before you try trying the @mmazurovsky 's solution, update your OS if you're using Bigsur. I hava M1 Macbook pro 13 and used Bigsur OS. After update, it works without any code changes! ~It's a bigsur problem.~

Still error?

Try @mmazurovsky 's solution. It's working well on Bigsur.

  1. Get redis binary file (arm)
    • $ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
    • $ tar xzf redis-6.2.6.tar.gz
    • $ cd redis-6.2.6
    • $ make
    • Copy redis-6.2.6/src/redis-server file to your project.
  2. Running Redis server with redis binary file in my case, the file path is src/test/resources/binary/redis-server

    @TestConfiguration
    public class TestRedisConfig {
    private RedisServer redisServer;
    
    @PostConstruct
    public void setUp() throws IOException {
        final int redisDefaultPort = 6379;
        this.redisServer = getRedisServer(redisDefaultPort);
        redisServer.start();
    }
    
    @PreDestroy
    public void stopRedis() {
        if (Objects.nonNull(redisServer) && redisServer.isActive()) {
            redisServer.stop();
        }
    }
    
    private RedisServer getRedisServer(int port) throws IOException {
        if (isMacM1()) {
            return new RedisServer(
                    RedisExecProvider.defaultProvider()
                            .override(OS.MAC_OS_X, Architecture.x86_64, "binary/redis-server"),
                    redisPort);
        } else {
            return new RedisServer(redisPort);
        }
    }
    
    private boolean isMacM1() {
        if (!System.getProperty("os.name").equals("Mac OS X")) {
            return false;
        }
    
        return System.getProperty("os.arch").equals("aarch64") || System.getProperty("os.arch").equals("x86_64");
    }
    }
vjsantojaca commented 8 months ago

This comment https://github.com/kstyrc/embedded-redis/issues/135#issuecomment-1770406528

coiouhkc commented 2 weeks ago

Rosetta 2 support the Mach-0 x64 binary and starts it without problems under M2 Mac, still, using Testcontainers should be (imo) the better/preferred option.