Redis连接DB0查到DB3数据之谜
2026/4/18 0:28:20 网站建设 项目流程

在开发或者运维的时候,你可能遇到过这样的问题:

“我连的明明是 Redis 的 DB0,为什么执行KEYS *会看到本来应该在 DB3 的数据?”

看起来很奇怪,其实这和 Redis 的部署方式有关系。下面我们就从原理讲起,用实际例子说清楚这个问题。


一、Redis 多数据库是怎么回事

单机(Standalone)模式下,Redis 默认有16 个逻辑数据库,编号是db0db15。你可以通过配置文件里的databases参数改这个数量。

每个数据库都有自己的键空间,也就是说:

  • 在 DB0 里写SET user:1 "Alice"
  • 在 DB3 里写SET user:1 "Bob"

这两个 key 不会互相影响。

你可以用SELECT <编号>来切换当前用的是哪个数据库:

127.0.0.1:6379> SELECT 3 OK 127.0.0.1:6379[3]> SET test "hello" OK

二、为什么连 DB0 却能看到 DB3 的数据

具体情况

比如你用客户端连上 Redis,然后运行:

127.0.0.1:6379> KEYS * 1) "session:abc" 2) "cache:user:123" 3) "temp:data"

你记得这些 key 是在 DB3 里存的,但现在没切到 DB3,怎么还能查到?

真正原因:你用的是 Redis 集群(Cluster)模式!

Redis Cluster 模式下只支持 DB0,所有SELECT命令都会报错:

127.0.0.1:7000> SELECT 3 (error) ERR SELECT is not allowed in cluster mode

而且,集群模式根本没有 DB1、DB2……DB15 这些东西,所有数据都放在同一个地方——就是 DB0。

所以,你“以为”把数据写进了 DB3,其实全都写到了 DB0。自然在 DB0 就能查到它们。


三、为什么 Redis 集群不支持多个数据库

这是因为 Redis 集群用了槽位(slot)分片的方式来管理数据。

  • 所有 key 被分成16384 个槽
  • 每个 key 用CRC16(key) % 16384算出属于哪个槽
  • 槽被分配到不同节点上,实现分布式存储

如果允许多个数据库,就会出问题:

  • 同一个 key(比如user:1)在 DB0 和 DB3 里,会算出一样的槽号
  • 但它们其实是不同的数据,这样就乱了
  • 节点迁移、备份、恢复这些操作也会变得很难处理

所以,Redis 官方直接在代码里禁止了集群模式下的多数据库功能

源码里写得很清楚:In cluster mode, only DB0 is allowed.


四、什么时候可以用多数据库

部署方式能不能用多个 DB建议
单机 Redis✅ 可以可以用来分开开发、测试等环境(比如 DB0=开发,DB1=测试)
主从复制✅ 可以主库的所有 DB 都会同步到从库
Sentinel 高可用✅ 可以因为基于主从,也支持多 DB
Redis Cluster只能用 DB0不要用 SELECT,所有数据都在 DB0

📌建议做法:在集群环境下,如果要分开不同用途的数据,请用key 加前缀的方法(比如user:123order:456),不要靠换数据库。


五、怎么排查这个问题

如果你发现 DB0 里有“DB3 的数据”,可以这样做:

  1. 先看是不是集群模式

    CLUSTER INFO

    如果有返回内容,说明是集群。

  2. 检查你的代码

    • 是不是以为切到了 DB3,但其实没成功?
    • 在集群里用SELECT会报错,要看看有没有忽略这个错误。
  3. 查一下数据是怎么写进去的

    • 可以临时用MONITOR(注意会影响性能)或者看日志,确认写 key 的时候到底在哪个 DB。

六、总结一下

  • 单机 Redis:DB0 到 DB15 是分开的,SELECT有用。
  • Redis Cluster只有 DB0,所有数据都在一起。
  • 所谓“在 DB0 查到 DB3 的数据”,其实是:数据根本没进 DB3,全在 DB0
  • 用集群时,要用key 前缀来区分不同类型的数据,不要依赖数据库编号。

搞懂这一点,既能避免数据混乱,也能在面试时清楚回答:“为什么 Redis 集群只能用 DB0?”

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询