Redis 6.0+支持ACL,需确认版本并启用;默认用户仍具全权,须按业务建模用户与key前缀(如~order:*),禁用危险命令,注意权限顺序及客户端显式传用户名。

确认 Redis 版本和 ACL 基础状态
ACL 功能仅在 Redis 6.0+ 生效,低于该版本无法使用 ACL SETUSER 或 ACL LIST。运行 redis-server --version 确认版本;若为 6.0 以下,必须升级。启动后执行 ACL LIST,你会看到默认用户:user default on nopass ~* &* +@all —— 这意味着所有连接仍拥有全部权限,ACL 尚未真正启用隔离。
按业务逻辑建模用户与 key 前缀绑定
不同业务模块(如订单、用户、配置)应对应独立的 key 命名空间,例如 order:123、user:456、cfg:timeout。ACL 的 ~ 规则只支持 glob 模式,不支持正则,所以不能写 ~order.*,但可以写 ~order:* 或 ~user:*。关键点在于:一个用户只能声明一组 key pattern,无法叠加多个(比如 ~order:* ~user:* 是非法语法),因此必须按业务边界严格划分用户。
- 订单服务专用用户:
ACL SETUSER order_svc on >ord123! ~order:* +@read +@write -FLUSHDB -FLUSHALL - 配置中心只读用户:
ACL SETUSER cfg_reader on >cfg456# ~cfg:* +@read - 运维账号(需谨慎):
ACL SETUSER ops on >ops789$ ~* +@all -@dangerous(-@dangerous显式排除DEBUG、CONFIG、SHUTDOWN等)
避免命令权限覆盖陷阱
ACL 权限是“最后一条规则生效”,且 +@category 和 -command 可混用,但顺序影响结果。例如:+@write -SET -DEL 是合法的,表示“允许所有写类命令,但显式禁用 SET 和 DEL”;但反过来写 -SET -DEL +@write 会导致 SET 和 DEL 仍被 +@write 覆盖而放行——因为 +@write 内部已包含它们,后置的 -SET 并不会回溯取消。
- 细粒度控制优先用
+command/-command明确列举,少依赖+@category后再剔除 -
+@all是危险操作,一旦设置就很难靠后续-command完全限制(部分子命令可能未被归类) - 测试时用
ACL WHOAMI和ACL GETUSER核对当前会话实际生效的keys、commands字段,别只信命令输入顺序
客户端连接时必须显式传用户名
旧版 AUTH 默认走 default 用户,即使你创建了 order_svc,不指定用户名仍会以全权身份连接。Java/Jedis 需用带用户名的构造器或 auth 方法:
try (Jedis jedis = new Jedis("localhost", 6379)) {
jedis.auth("order_svc", "ord123!");
jedis.set("order:999", "pending"); // ✅ 允许
jedis.del("user:123"); // ❌ 报错 NOAUTH or NOPERM
}
Redis CLI 连接也要加 --user order_svc --pass ord123!,否则 AUTH ord123! 仍认证到 default。这点极易被忽略,导致以为 ACL 配置失败,其实是客户端没切用户。
真正麻烦的不是配置多难,而是 key pattern 写错、命令类别理解偏差、以及客户端漏传用户名这三处——它们不会报语法错误,只会静默失效。











