是否可以使用MIGRATE
将所有密钥从一个Redis实例复制到另一个远程实例?我试过COPY
,REPLACE
和KEYS
没有任何运气。每次我收到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
答案 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
################
答案 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));
}