改名与复制键
RENAME 把键改名,目标键已存在时会被静默覆盖;RENAMENX 只在目标不存在时才改名;COPY(6.2+)复制键值到新键,支持 REPLACE 覆盖与指定目标库。三者都不改变数据类型,但 RENAME 与 COPY 在集群模式下的限制更明显:Cluster 只有 0 号库,跨库复制不可用,且键改名必须落在同一槽。
基本信息
| 适用 | RENAME 与 RENAMENX 早期版本即可用,COPY 需 6.2+ |
|---|---|
| RENAME 行为 | 改名,目标存在则覆盖 |
| RENAMENX 行为 | 目标存在返回 0 且不改名 |
| COPY 选项 | DB 指定目标库、REPLACE 覆盖已存在的目标 |
| 集群限制 | 只有 DB 0,跨槽改名需应用层搬运 |
示例与验证
示例与验证
SET old v
RENAME old new # OK,old 消失,new 为 v
RENAMENX new newer # 1:目标不存在,改名成功
COPY new backup # 1:复制出新键
COPY new backup # 0:目标已存在,未覆盖
COPY new backup REPLACE # 1:显式覆盖目标
COPY new backup2 DB 1 # 复制到 1 号库(集群模式下不适用)
TYPE backup # string:确认类型未变化
MEMORY USAGE backup # 大 key 复制前先看单键内存占用命令行为对照
| 命令 | 目标存在时 | 注意事项 |
|---|---|---|
| RENAME | 静默覆盖 | 误覆盖的生产事故多来自这里 |
| RENAMENX | 返回 0,不改名 | 适合「目标空缺才改名」的场景 |
| COPY | 返回 0,不复制 | 需要覆盖时显式加 REPLACE |
| COPY ... DB n | 可指定目标库 | Cluster 只有 DB 0,跨库不可用 |
| 集群环境改名 | 要求同一槽 | 跨槽会报错,需用 MIGRATE 或应用搬运 |
典型使用场景
- 版本发布前切换键名,让新逻辑读取新键位
- 灰度期间用 COPY 保留旧键,便于快速回退
- 临时快照:复制一份键用于分析与比对
- 脚本迁移字段前缀,用 RENAMENX 避免覆盖已有数据
- 故障排查时复制现场数据,避免在原键上操作
RENAME 对键做的是引用改名,本身很快;但目标键被覆盖时旧值的对象释放与 COPY 大键都会带来明显的内存与耗时压力,大 key 操作建议放在低谷窗口。
在集群模式里对键做跨槽改名会直接报错,跨库复制也不可用;迁移类需求应使用 CLUSTER 的槽操作或由应用层搬运。
批量改名怎么做
- 大批量改名先用 SCAN 游标遍历键空间,再逐个处理,避免一次性阻塞
- 改名后旧键的引用要同步更新,否则应用会持续读到键不存在