首页/数据/Redis 进阶速查/COPY:实例内复制键
数据结构与选型42 条

COPY:实例内复制键

COPY 在同实例内复制键(可跨库、可 REPLACE 覆盖),免去客户端序列化往返;注意复制后内存占用增加且集群模式要求同槽。

Redis 进阶速查数据更新于 2026-10-13

COPY 是什么

COPY 是 Redis 6.2 引入的命令,在同一个实例内把源键连同它的值和剩余 TTL 一起复制成目标键,整个过程在服务端完成。客户端用 GET 再 SET 也能做出类似效果,但要把 value 拉到应用侧再写回,网络流量与序列化开销都由自己承担,TTL 还得手动重建。COPY 一条命令完成这件事,并额外支持 DB 选项跨库复制、REPLACE 覆盖已有目标。

基本信息

语法COPY source destination [DB destination-db] [REPLACE]
版本要求Redis 6.2.0 及以上
返回值1 复制成功;0 目标已存在且未加 REPLACE
适用平台Linux 自建实例、Redis Cluster、K8s 自建;部分云托管实例禁用该命令,用前先确认
权限要求默认用户即可;ACL 需 keyspace 与 write 类权限
TTL 行为源键剩余 TTL 一并复制,不重置

典型使用场景

  • 模板派生配置:以 template:config 为样板批量生成 config:<业务ID>
  • 隔离验证:把线上键复制到另一个库上改,不动生产数据
  • 大对象搬运:几十 MB 的 value 不必经过应用进程序列化
  • 灰度对照:复制一份到旁路键,用新逻辑读副本做结果比对
  • 现场留档:处置故障前先复制可疑键,保住原始数据

常用写法

常用写法
redis-cli COPY template:config config:1001              # 同库复制模板键
redis-cli COPY app:session:1001 app:session:1001:bak    # 复制出一份观察用副本
redis-cli COPY template:config config:1002 REPLACE      # 覆盖已存在的目标键
redis-cli COPY cache:warm cache:warm:db2 DB 2           # 复制到 2 号库
redis-cli TTL template:config                           # 记录源键剩余 TTL
redis-cli TTL config:1001                               # 目标 TTL 应与源键一致

参数逐项读法

参数含义注意
source源键名不存在时返回 0,不抛错
destination目标键名已存在且无 REPLACE 时返回 0
DB n把目标写到第 n 号库集群模式只接受 0 号库
REPLACE覆盖已存在的目标键不带它时旧值原样保留
TTL 属于被复制的内容:源键还剩 300 秒,副本也剩 300 秒,不会变成永久键。希望副本长期存在时,复制后再用 EXPIRE 或 PERSIST 调整。
COPY 在服务端同步执行,复制一个几百万元素的集合会让主线程持续工作,期间其他请求排队等待;批量派生模板键要分批并在低峰做。

易错点

  • 目标键已存在又漏写 REPLACE 时命令返回 0 而非报错,只判「有没有异常」的代码会把没复制成功当成成功
  • 复制瞬间源与目标各占一份内存,大 value 让占用接近翻倍;maxmemory 吃紧的实例可能触发淘汰甚至写入失败
  • 集群模式下源与目标必须落在同一槽,跨槽会报 CROSSSLOT 类错误;批量生成配置键时用 hash tag 把同组键固定到同一槽
  • 把 COPY 当备份手段不成立:副本与源在同一实例,实例整体故障时一起丢,持久化仍要靠 RDB/AOF 与主从

数据来源与参考

  • Redis 官方文档:COPY 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌