多库的边界与代价
Redis 默认提供 16 个逻辑库(由 databases 参数决定),用 SELECT 或客户端的 -n 参数切换。它们共享同一份内存、同一套淘汰策略与同一个 maxmemory 上限,所以多库隔离的是键空间视图,而不是资源。集群模式下只能使用 0 号库,databases 被固定为 1,SWAPDB 之类的库级操作也只适用于非集群部署。工程上更常见的做法是单库加键名前缀,既方便迁移也便于后续集群化。
基本信息
| 默认库数 | 16(databases 配置项) |
|---|---|
| 切换命令 | SELECT index |
| 客户端写法 | redis-cli -n 1 |
| 集群限制 | 仅 0 号库可用 |
| 统计方式 | INFO keyspace 按库列出 |
| 清理范围 | FLUSHDB 只清当前库 |
| 库间操作 | SWAPDB 互换两个库的数据 |
典型使用场景
- 同一实例上区分环境或租户的数据,用库做视图隔离
- 排查某个键在哪个库里,用 INFO keyspace 逐库核对
- 规划迁移到集群,评估现有 SELECT 用法要改多少
- 清理测试数据时只清指定库,避免影响其他业务
- 解释多库并不隔离内存与淘汰,避免容量误判
- 把历史遗留的多库用法逐步收敛为键前缀方案
- 运维脚本需要指定库执行命令,确认客户端参数写法
- 审计键空间占用时按库统计并汇总到实例总量
查看与切换
查看与切换
redis-cli -n 1 DBSIZE # 不带 SELECT 直接指定库
redis-cli SELECT 1 # 交互会话中切换
redis-cli INFO keyspace # 各库键数与过期键数
redis-cli -n 1 FLUSHDB # 只清 1 号库
redis-cli CONFIG GET databases # 当前库数量设置
redis-cli -n 0 CLIENT INFO # 确认当前连接所在库多库与键前缀对照
| 对比项 | 多库 | 键前缀 |
|---|---|---|
| 资源隔离 | 不隔离内存与淘汰 | 同样不隔离 |
| 集群兼容 | 不支持多库 | 兼容 |
| 迁移成本 | 需改写 SELECT 逻辑 | 迁移时基本不改代码 |
| 统计粒度 | 按库统计 | 需按前缀聚合 |
多库隔离的是键空间视图而非资源:maxmemory、淘汰策略、持久化与复制都是实例级共享的。
计划集群化之前先统计 SELECT 的使用量,避免迁移中途才发现需要大规模改造客户端。
INFO keyspace 里的过期键数量是按库统计的,排查内存时别把某一个库的数字当成实例总量。