SpringBoot配置随机端口启动嵌入式Redis报错求助
嵌入式Redis配置随机端口启动失败的解决方案
问题复现
代码实现
@Value("${spring.redis.embedded.port}") private int redisPort; private RedisServer redisServer; @PostConstruct public void startRedisServer() throws IOException { System.out.println("port is "+redisPort); redisServer = new RedisServerBuilder() .port(redisPort) // .setting("bind 0.0.0.0") // Listen on all network interfaces .build(); redisServer.start(); System.out.println("redis port is "+redisServer.ports()); } @PreDestroy public void stopRedisServer() { if (redisServer != null) { redisServer.stop(); } } @Bean public int redisPort() { return redisServer.ports().get(0); }
配置与异常
在application-test.properties中配置spring.redis.embedded.port=0,期望让嵌入式Redis使用随机可用端口启动,却抛出异常:
Caused by: java.lang.RuntimeException: Can't start redis server. Check logs for details. Redis process log:
[16480] 24 Jan 10:32:04.901 # Configured to not listen anywhere, exiting.
at redis.embedded.AbstractRedisInstance.awaitRedisServerReady(AbstractRedisInstance.java:70)
at redis.embedded.AbstractRedisInstance.start(AbstractRedisInstance.java:42)
at redis.embedded.RedisServer.start(RedisServer.java:9)
解决方案
- 启用网络绑定配置:取消注释代码中的
.setting("bind 0.0.0.0"),让Redis监听所有网络接口。当端口设为0时,Redis需要明确指定绑定地址,否则会判定为无监听地址而退出。 - 简化随机端口配置:如果不需要手动指定端口变量,可直接删除
@Value注入的redisPort,让RedisServer自动分配随机端口,修改后的启动代码如下:
@PostConstruct public void startRedisServer() throws IOException { redisServer = new RedisServerBuilder() .setting("bind 0.0.0.0") .build(); redisServer.start(); System.out.println("redis port is "+redisServer.ports()); }
- 验证端口获取:
redisServer.ports().get(0)可以正确获取到随机分配的端口,原有的redisPort()Bean配置无需修改。
内容的提问来源于stack exchange,提问作者Anju Singh
相关产品推荐
相关产品推荐

