*Redis SWAPDB 命令

交换两个数据库的数据。交换后所有 key 属于另一个数据库索引。


*语法

SWAPDB index1 index2

*参数说明

参数 类型 必填 说明
index1 Integer 第一个数据库索引
index2 Integer 第二个数据库索引

*返回值

条件 返回值
交换成功 OK
索引无效 错误

*时间复杂度

O(1)

*

*示例

> SELECT 0
OK
> SET key1 "db0_value"
OK

> SELECT 1
OK
> SET key1 "db1_value"
OK

> SWAPDB 0 1
OK

> SELECT 0
OK
> GET key1
"db1_value"

> SELECT 1
OK
> GET key1
"db0_value"

*常见错误

错误 原因 解决
ERR DB index is out of range 索引超出配置范围 检查 databases 配置和索引范围
正在使用的数据库被交换 业务逻辑依赖当前数据库 业务层做好兼容性设计
索引不是整数 传入了非数字字符串 确保传入整数索引

*最佳实践

  1. 原子切换命名空间:将当前活跃数据库与预备数据库原子交换,实现零停机切换。
  2. 注意连接状态:正在 SELECT 某个 DB 的连接,SWAPDB 后该连接看到的 key 已变。

  3. 持久化一致性:SWAPDB 不触发 RDB/AOF 持久化,交换后应立即执行 BGSAVE 确保数据安全。

  4. 限权控制:SWAPDB 是管理命令,应限制在生产环境直接暴露,防止误操作。

*5. 交换前验证:交换前在两个 DB 中设置验证 key,交换后读取确认逻辑正确。

*FAQ

Q1: SWAPDB 是原子操作吗? A: 是。整个交换过程瞬间完成,其他客户端不会看到中间状态。

Q2: SWAPDB 后已有连接的 SELECT 会变吗? A: 不会。连接当前选中的 DB 索引不变,但该索引对应的 key 集合已交换。

Q3: SWAPDB 影响其他客户端吗? A: 影响。所有连接当前 SELECT 的数据库内容瞬间互换,可能导致其他客户端逻辑异常。

Q4: SWAPDB 支持集群模式吗? A: 不支持。Redis Cluster 只有一个逻辑数据库(DB 0),SWAPDB 无意义。

Q5: SWAPDB 0 1 和 SWAPDB 1 0 有区别吗? A: 没有区别,SWAPDB 是对称操作,交换结果完全相同。