多逻辑库的使用与边界
Redis 默认提供 16 个逻辑库,通过 SELECT 切换连接当前操作的目标库;MOVE 把单个键从一个库搬到另一个库,SWAPDB 原子交换两个库的全部内容。多库只是同一实例内的逻辑分区:它们共享内存、CPU 与持久化文件,因此不能用来做资源隔离,也不能在集群模式下使用。
基本信息
| 适用平台 | Redis 单机与主从模式;Cluster 模式只有 DB 0 |
|---|---|
| 默认库数量 | 16(可用 databases 参数调整) |
| 切换命令 | SELECT index |
| 搬键命令 | MOVE key db |
| 整体交换 | SWAPDB index1 index2 |
典型使用场景
- 本地开发时用不同编号的库存放不同环境的测试数据
- 临时隔离:把有问题的键挪到另一个库便于排查
- 发布切换:用 SWAPDB 原子把新数据换到生效库
- 命令行操作时指定库:redis-cli -n 3 直接进入目标库
- 清理维护:分别查看各库的键数量与内存占用
常用操作
常用操作
SELECT 1 # 切换当前连接的目标库
SET k v
MOVE k 2 # 返回 1 表示把 k 移到 2 号库
SELECT 2
GET k # 返回 v
SWAPDB 0 1 # 原子交换 0 号与 1 号库的内容
# 命令行直接指定库
redis-cli -n 3 DBSIZE
# 查看各库键数量
redis-cli INFO keyspace命令对照
| 命令 | 作用 | 限制 |
|---|---|---|
| SELECT index | 切换连接的默认库 | Cluster 模式不支持 |
| MOVE key db | 把键移到目标库 | 目标库已存在同名键时失败 |
| SWAPDB a b | 原子交换两个库 | 集群模式不支持 |
| INFO keyspace | 查看各库键数量与过期键数 | 不含内存明细 |
| DBSIZE | 当前库的键数量 | 作用于当前选中的库 |
多库不等于多实例:同一实例内所有库共享内存上限与主线程,某个库里的慢命令同样会影响其他库的请求。真正需要隔离时应拆分实例或使用集群。
用多个库做多租户隔离但共享 maxmemory:一个租户的流量可以把内存吃到上限,触发全局淘汰把其他租户的数据一起挤掉。
SWAPDB 常被用来做「原子发布」:新数据先写进备用库,准备好后一次交换,生效过程没有中间态。但它只交换内容,不改变客户端连接当前的库编号,应用侧的键前缀与监控口径都要跟着调整。