使用MIGRATE复制Redis数据库中的所有密钥

时间:2016-05-11 15:19:51

标签: redis

是否可以使用MIGRATE将所有密钥从一个Redis实例复制到另一个远程实例?我试过COPYREPLACEKEYS没有任何运气。每次我收到NOKEY回复。如果我使用任何MIGRATE命令只使用一个键就可以了。

示例:

MIGRATE my.redis 6379 "*" 0 5000 REPLACE // NOKEY
MIGRATE my.redis 6379 "*" 0 5000 COPY // NOKEY
MIGRATE my.redis 6379 "" 0 5000 KEYS * // NOKEY

MIGRATE my.redis 6379 "" 0 5000 KEYS test // OK

5 个答案:

答案 0 :(得分:4)

尝试在你的shell中运行

redis-cli keys '*' | xargs -I '{}' redis-cli migrate my.redis 6379 "" 0 5000 KEYS '{}'

答案 1 :(得分:2)

这是the answer提供的@ezain的改进,因为我无法发表评论。该命令使用正确的redis语法处理批量密钥,但是xargs的参数导致为每个密钥调用一次命令,而不是仅包括所有密钥一次(这意味着它将需要更多完成时间比必要的时间)。在所有情况下,以下内容会快得多:

redis-cli --raw KEYS '*' | xargs redis-cli MIGRATE my.redis 6379 "" 0 5000 KEYS

答案 2 :(得分:0)

对于具有很多键的大型数据库,最好使用--scan而不是keys,以避免Redis锁定KEYS命令:

redis-cli --scan | xargs redis-cli MIGRATE my.redis 6379 "" 0 5000 KEYS

与问题无关,但如果有人需要它:Redis不支持{3.0.1}之前的密码。在3.0之后,您可以添加MIGRATE参数来检查权限:

AUTH

答案 3 :(得分:0)

如果您在非托管¹ redis 实例上运行,最理想的方法可能是暂时将目标实例作为副本运行,然后禁用(在复制所有数据后)复制。

查看 redis 中的 REPLICAOF 命令。如何应用它(目标实例上的所有命令):

启动复制:$ replicaof source_hostname_or_ip source_port

一切完成后:$ replicaof no one

如果你不能使用这个命令¹,那么你可以在数字海洋博客上试试这个脚本:https://www.digitalocean.com/community/tutorials/how-to-migrate-redis-data-to-a-digitalocean-managed-database#step-3-%E2%80%94-building-the-migration-script

################

¹ - 托管服务通常会限制此命令的使用,请参阅 herehere

答案 4 :(得分:-2)

我并不主张使用它,但我尝试了所有这些例子,还有许多其他例子并没有用。我最终用PHP自己做了,所以也许这会帮助其他被困的人。

<?php 

$redisSource = new Redis();
$redisSource->connect('1.2.3.4', 6379);
$redisSource->auth('password');

$redisTarget = new Redis();
$redisTarget->connect('127.0.0.1', 6379);

foreach($redisSource->keys('*') as $key) {
    $redisTarget->set($key, $redisSource->get($key));
}