用redis将所有密钥从一个db复制到另一个db

Sub*_*ubo 22 redis

移动的机制我想将我的所有密钥从特定的数据库复制到另一个数据库.如果是,可以在redis中使用吗?

est*_*ani 32

如果由于您的redis版本而无法使用MIGRATE COPY,则可能需要单独复制每个密钥,这需要更长的时间,但不需要您登录到计算机本身,并允许您将数据从一个数据库移动到另一个数据库.这是我如何将所有键从一个数据库复制到另一个数据库(但不保留ttls)

#set connection data accordingly
source_host=localhost
source_port=6379
source_db=0
target_host=localhost
target_port=6379
target_db=1

#copy all keys without preserving ttl!
redis-cli -h $source_host -p $source_port -n $source_db keys \* | while read key; do echo "Copying $key"; redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1|redis-cli -x -h $target_host -p $target_port -n $target_db RESTORE "$key" 0; done
Run Code Online (Sandbox Code Playgroud)

密钥不会被覆盖,因为在复制之前删除密钥或在启动之前刷新整个数据库.

  • 对于 redis 版本 > 2.6,您可以使用迁移命令 `redis-cli keys \* | 读键时;做 echo "复制 $key"; abc="迁移本地主机 1234 $key 0 5000 复制"; redis-cli“迁移本地主机 1234 $key 0 5000 COPY”;完成` (2认同)
  • 我已经创建了 [一个支持身份验证和 TTL 的要点](https://gist.github.com/nicStuff/ee7feb8eed00174a46db42812545b403)。@uditmittal 太好了,无论如何考虑到 MIGRATE 不支持身份验证,即使在 3.2 版本中也不支持。 (2认同)
  • 使用“KEYS”命令对性能有严重影响(请参阅 https://redis.io/commands/KEYS 上的“警告”)。考虑使用 `SCAN` 命令来查找要复制的所有键。 (2认同)
  • 如果在 AWS ElastiCache 上进行迁移,您讨厌使用 @Estani 解决方案!AWS 阻止某些命令作为迁移命令:https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/RestrictedCommands.html (2认同)
  • 值得注意的是,这不会保留复制密钥的 TTL - 它基本上将永远保留缓存中的所有内容,因此恢复命令中的“0”。您将需要使用 PTTL 的更高级命令,或者仅使用 MIGRATE。 (2认同)

Kha*_*yan 5

最新解决方案:

使用Redislabs提供的RIOT开源命令行工具复制数据。

参考: https: //developer.redis.com/riot/#_replicate_dump_and_restore

GitHub项目链接: https: //github.com/redis-developer/riot

如何安装: https: //developer.redis.com/riot/#_install

# Source Redis db
SH=test1-redis.com
SP=6379

# Target Redis db
TH=test1-redis.com
TP=6379 

# Copy from db0 to db1  (standalone Redis db, Or cluster mode disabled)
# 
riot-redis -h $SH -p $SP --db 0 replicate -h $TH -p $TP --db 1 --batch 10000 \
--scan-count 10000 \
--threads 4 \
--reader-threads 4 \
--reader-batch 500 \
--reader-queue 2000 \
--reader-pool 4 
Run Code Online (Sandbox Code Playgroud)

RIOT 速度更快,支持多线程,并且可以很好地与跨环境 Redis 数据复制(AWS Elasticache、Redis OSS 和 Redislabs)配合使用。