本地Redis集群连接失败:JedisClusterOperationException问题求助
Redis Cluster Docker镜像Java连接失败问题解决
我在本地运行了一个Redis Cluster Docker镜像,尝试用Java代码连接时出错。
相关信息
Java代码
JedisCluster jedisCluster = new JedisCluster(new HostAndPort("localhost", 7000));
Docker启动命令
docker run -d -p 7000-7005:7000-7005 --name redis-cluster grokzen/redis-cluster
报错信息
<JedisClusterOperationException> Could not initialize cluster slots cache.
Maven依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.2.0</version> </dependency>
操作系统
Ubuntu
更新信息
执行命令 redis-cli -p 7000 后运行 ping 命令,得到如下错误:
(错误) DENIED Redis处于保护模式,因为保护模式已启用且默认用户未设置密码。在此模式下,仅接受来自环回接口的连接。如果要从外部计算机连接Redis,可以采用以下解决方案之一:1) 从运行服务器的同一主机连接Redis,执行命令'CONFIG SET protected-mode no'关闭保护模式,但这样做请确保Redis不会被互联网公开访问。使用CONFIG REWRITE使更改永久生效。2) 或者可以编辑Redis配置文件,将保护模式选项设置为'no',然后重启服务器。3) 如果只是为了测试手动启动服务器,可以使用'--protected-mode no'选项重启。4) 为默认用户设置认证密码。注意:只需执行上述其中一项操作,服务器即可接受外部连接。
解决方案
根据报错信息,问题根源是Redis保护模式阻止了外部连接(Java程序虽在本地,但Docker容器内的Redis将外部请求视为非环回连接),可按以下任一方式解决:
方案1:临时关闭保护模式(容器内操作)
- 进入Redis容器:
docker exec -it redis-cluster bash
- 连接7000端口的Redis节点:
redis-cli -p 7000
- 执行命令关闭保护模式:
CONFIG SET protected-mode no
- (可选)若需永久生效,执行:
CONFIG REWRITE
方案2:启动容器时直接关闭保护模式
修改Docker启动命令,通过环境变量关闭保护模式(grokzen/redis-cluster镜像支持此配置):
docker run -d -p 7000-7005:7000-7005 -e REDIS_PROTECTED_MODE=no --name redis-cluster grokzen/redis-cluster
方案3:设置Redis密码
- 进入容器连接Redis节点,设置密码:
CONFIG SET requirepass "你的密码"
- (可选)永久生效:
CONFIG REWRITE
- 修改Java代码,添加密码配置:
Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("localhost", 7000)); JedisPoolConfig poolConfig = new JedisPoolConfig(); JedisCluster jedisCluster = new JedisCluster(nodes, 6000, 6000, 3, "你的密码", poolConfig);
额外注意事项
- 确保Docker端口映射完整(7000-7005端口均已映射),Redis Cluster需要多节点通信。
- 检查Ubuntu防火墙是否允许这些端口的流量,可临时执行
ufw allow 7000:7005/tcp开放端口。
内容的提问来源于stack exchange,提问作者MA1
相关产品推荐
相关产品推荐

