You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lettuce 6.0.x连接带TLS的Redis集群失败求助

问题分析与解决

从错误信息ERR command is not allowed来看,核心问题是Lettuce在获取Redis集群拓扑信息时,执行的集群相关命令被拒绝,主要有两种可能性:账号权限不足,或者Lettuce的拓扑刷新逻辑未正确处理认证/命令权限。

解决步骤

1. 验证账号的集群命令权限

先通过redis-cli验证连接账号是否能执行集群拓扑命令:

# 连接集群后执行
CLUSTER SLOTS

如果返回ERR command is not allowed,说明账号缺少集群命令权限,需要给账号授权:

  • 如果Redis使用ACL:
    ACL SETUSER your_username ON >your_password +@cluster +@read
    
    (+@cluster表示授予所有集群相关命令权限,可根据实际需求调整)
  • 如果Redis使用传统requirepass配置,确认requirepass和masterauth已正确设置,且默认用户有权限执行集群命令。

2. 修正Lettuce的RedisURI配置

确保SSL连接的URI配置正确,建议直接使用rediss协议(SSL专用)构建URI,替代redis()加withSsl(true)的方式:

RedisURI redisUri = RedisURI.Builder.rediss(enterpriseConfig.getEndpoint())
    .withAuthentication(userName, password)
    .withPort(port)
    .build();

3. 调整拓扑刷新的命令来源

如果集群禁用了CLUSTER命令,但允许INFO命令,可以配置Lettuce使用INFO获取拓扑信息:

ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
    .enablePeriodicRefresh()
    .enableAllAdaptiveRefreshTriggers()
    .refreshTriggersReconnectAttempts(3)
    .useInfoForRefresh(true) // 启用INFO命令获取拓扑
    .build();

4. 确认SSL配置正确性

检查buildSslOptions()方法的以下细节:

  • 确保keystore和truststore的路径、密码、类型完全正确
  • 确认keystore中包含完整的证书链(和redis-cli使用的redis.example.com.chain.pem一致)
  • 确认truststore中包含Redis服务端证书的根CA(和redis-cli信任的CA一致)

5. 验证端口一致性

确认代码中使用的port变量和redis-cli连接时的端口一致(比如你步骤2中用的是6375,代码中是否正确设置了该端口)

内容的提问来源于stack exchange,提问作者JShao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:49:52