Navicat连Redis 7.0后Key列表为空的主因是ACL权限不全:default用户默认缺keys ~*和+scan(或+@keyspace),而SCAN命令需命令权限与键空间权限双重满足;另需确认是否启用RESP3协议及连接时指定正确ACL用户名。
Navicat 连 Redis 7.0 后 Key 列表为空,常见原因不是连接失败,而是 ACL 权限没给全
redis 7.0 默认启用 acl,且 default 用户权限可能被改过——哪怕你没手动配过 acl,某些一键部署脚本或容器镜像会默认禁用 ~* 键模式。navicat 要列出 key,本质是执行 scan(或 keys,但后者不推荐),而 scan 需要同时满足两个条件:有命令权限(+scan 或 +@keyspace),且有对应 key 空间访问权(~* 或具体前缀)。
容易踩的坑:
-
ACL GETUSER default返回keys ~tenant:123:*—— 这种写法在 Redis 7.0 是无效的,前缀通配符(如~tenant:*:)仅在 7.0+ 实验性支持,且需显式开启acl-pubsub-default并配合ACL SETUSER手动启用,生产环境不建议依赖 - 只加了
+@all,但漏掉keys ~*—— 命令能跑,Key 就是看不见,因为 ACL 是“命令 + 键空间”双校验 - 用了
ACL LOAD加载了自定义用户,但 Navicat 连接时没填用户名,默认走default用户,权限还是老的
如何确认当前连接用的是哪个 ACL 用户、权限是否完整
在 Navicat 的查询窗口直接执行:
ACL LIST ACL GETUSER default
看输出里有没有 keys ~*;如果没有,说明 Key 空间没放开。再检查 commands 字段是否含 +scan 或 +@keyspace(+@all 包含它,但别假设——得亲眼看见)。
实操建议:
- 临时验证:执行
ACL SETUSER default on ~* +@keyspace,然后刷新 Navicat 连接(或重连) - 如果连的是非
default用户,比如tenant_admin,必须在 Navicat 连接配置页明确填上用户名和密码,否则仍走default - 注意:Redis 7.0 的
ACL SETUSER不会自动持久化,重启后失效;要写入配置文件或执行ACL SAVE
Redis 7.0 下用 ACL 实现租户 Key 隔离,为什么不能靠 ~tenant:123:* 这种写法
因为 Redis 官方文档明确说明:ACL 的键模式(~pattern)在 7.0 中仍**不支持通配符前缀匹配**,只支持字面量 Key 名、~* 全局通配,或实验性的 ~{prefix}*(需开启 acl-pubsub-default yes 且未被广泛验证)。你写的 ~tenant:123:* 在 ACL GETUSER 输出里看着存在,但实际不生效——SCAN 仍会被拒绝。
真正可行的隔离方式只有两种:
- 应用层硬隔离:每个租户用独立 Redis 实例或数据库编号(
SELECT 1,SELECT 2),ACL 不参与 Key 控制 - ACL + 命名约定 + 审计:放开
~*,但靠业务代码保证只操作自己前缀的 Key,并用MONITOR或慢日志定期审计越界行为
Navicat 连接后能执行命令但 Key 树不展开,还可能是 RESP3 协议兼容问题
Redis 7.0 默认启用 RESP3,而旧版 Navicat(如 v16 及更早)默认用 RESP2 连接。虽然协议向下兼容,但某些 GUI 功能(比如 Key 列表加载逻辑)会因协议协商异常静默失败。
解决方法很直接:
- 升级 Navicat for Redis 至 v17 或更高版本(官方 2026 年 3 月起已全面适配 RESP3)
- 或在连接配置中手动勾选 “Use RESP3 protocol”(部分版本支持该选项)
- 验证方式:连上后执行
HELLO 3,返回proto字段为3即表示 RESP3 已激活
复杂点在于,ACL 权限、协议版本、用户上下文三者叠加后,错误现象高度一致(Key 空、无报错、命令可执行),必须逐项排除,不能只盯一个配置项。











