*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 配置和索引范围 |
| 正在使用的数据库被交换 | 业务逻辑依赖当前数据库 | 业务层做好兼容性设计 |
| 索引不是整数 | 传入了非数字字符串 | 确保传入整数索引 |
*最佳实践
- 原子切换命名空间:将当前活跃数据库与预备数据库原子交换,实现零停机切换。
注意连接状态:正在 SELECT 某个 DB 的连接,SWAPDB 后该连接看到的 key 已变。
持久化一致性:SWAPDB 不触发 RDB/AOF 持久化,交换后应立即执行 BGSAVE 确保数据安全。
限权控制: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 是对称操作,交换结果完全相同。