当前位置: 首页 > news >正文

Redis连接DB0查到DB3数据之谜

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

“我连的明明是 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?”

http://www.jsqmd.com/news/655029/

相关文章:

  • Unity小地图进阶:从基础渲染到UI美化的全流程实战
  • 从BIOS到UEFI:EFI分区与.efi文件如何重塑现代计算机启动?
  • YDFID-1色织物数据集:如何用AI技术革新纺织行业质检标准
  • Qwen3.5-9B-AWQ-4bit
  • 2026 广州番禺高端汽车贴膜与品质升级攻略:打造专属爱车的极致体验 - GrowthUME
  • 阿里云DataWorks离线同步实战:从本地MySQL到MySQL的数据迁移
  • CSS 电影票
  • 灰指甲加盟品牌哪个更可靠?
  • Reloaded-II实用指南:5步掌握高效游戏模组管理与故障排查
  • 基于STM32LXXX的无线收发芯片(S2-LPQTR)应用程序设计
  • 企业云盘私有化部署:存储架构设计与安全运维全流程实战
  • 深入理解计算机的“心脏”:从ALU设计看华中科大计组实验的精髓
  • 专业显卡驱动清理工具实战指南:Display Driver Uninstaller 深度解析与安全操作手册
  • GESP2023年12月认证C++三级( 第一部分选择题(9-15))
  • 无刷磁力搅拌器哪家靠谱?口碑品牌与源头供应商整理(2026年) - 品牌推荐大师1
  • 智能报告员中的信息汇总与结果呈现
  • 2026高质感纹理漆实力厂家|桔纹漆砂纹漆裂纹漆一站式推荐 - 栗子测评
  • Qwen3-TTS-Tokenizer-12Hz快速上手:Flac无损音频token化后体积压缩比实测
  • Youtu-Parsing自动化运维:监控、日志与弹性伸缩配置
  • 告别软件切换!保姆级教程:在通达信里直接调用扫雷宝网页版查财务风险
  • PyTorch模型搭建的两种命名术:用OrderedDict给你的nn.Sequential层起个好名字
  • 如何彻底解决AMD显卡风扇控制问题:FanControl深度解析与实战指南
  • uniapp 单选标签radio-group导致css样式失效问题调整
  • 别再手动敲命令了!用Ansible 2.9批量管理华为ENSP模拟器里的路由器(保姆级避坑指南)
  • Janus-Pro-7B在C语言教学中的应用:智能代码纠错与讲解
  • Wan2.2-I2V-A14B科研应用:实验室科研成果可视化动态视频生成系统
  • LogcatReader:终极简单安卓日志查看器完整使用指南
  • 加盟灰指甲店哪个可靠?选「甲医生」
  • aidegen实战指南:一键生成AOSP项目的IDE配置,提升Java与C/C++开发效率
  • 炉石传说HsMod插件:如何快速提升游戏体验的55个实用功能指南