Redis将所有密钥从一个数据库移至另一个数据库

问题描述 投票:4回答:3

是否有将Redis密钥从一个数据库移动到另一个数据库的命令,或者仅通过lua脚本可以实现吗?

曾经有人问过这种类型的问题redis move all keys,但答案并不恰当,这对于像我这样的初学者来说是很有说服力的。

redis
3个回答
5
投票

我认为这可以完成工作:

redis-cli keys '*' | xargs -I % redis-cli move % 1 > /dev/null

((1是新的数据库号,并且重定向到/ dev / null是为了避免获得数以百万计的'1'行,因为它将逐个移动键并每次返回1)]

请注意redis可能会耗尽连接,然后会显示大量此类错误:

无法通过127.0.0.1:6379连接到Redis:无法分配请求的地址

因此,仅转储数据库,然后将其导入到新数据库中会更好(更快)。


4
投票

您可以使用“ MOVE”将一个键移动到另一个Redis数据库;

下面的文字来自redis.io

MOVE key db

将密钥从当前选定的数据库(请参见SELECT)移动到指定的目标数据库。如果目标数据库中已经存在密钥,或者源数据库中不存在密钥,则它什么也不做。因此,可以将MOVE用作锁定原语。

返回值

整数回复,特别是:

  • 如果键已移动,则为1。
  • 如果未移动键,则为0。

0
投票

[如果您有一个拥有数百万个键的大型数据库,则可以使用SCAN命令选择所有键(没有像[[dangerous KEYS命令那样的阻塞,即使Redis作者也不建议这样做。] >SCAN一页一页地给您键,其想法是从第0页开始(正式称为CURSOR 0),然后继续下一页/光标直到结束为止(停止信号是当您再次获得CURSOR 0时。

您可以为此使用任何流行的语言,例如Redis或Ruby或Scala。这里是使用Bash脚本的草稿:

#!/bin/bash -e REDIS_HOST=localhost PAGE_SIZE=10000 KEYS_TO_QUERY="*" SOURCE_DB=0 TARGET_DB=1 TOTAL=0 while [[ "$CURSOR" != "0" ]]; do CURSOR=${CURSOR:-0} >&2 echo $TOTAL:$CURSOR KEYS=$(redis-cli -h $REDIS_HOST -n $SOURCE_DB scan $CURSOR match "$KEYS_TO_QUERY" count $PAGE_SIZE) unset CURSOR for KEY in $KEYS; do if [[ -z $CURSOR ]]; then CURSOR=$KEY else TOTAL=$(($TOTAL + 1)) redis-cli -h $REDIS_HOST -n $SOURCE_DB move $KEY $TARGET_DB fi done done

重要:

和往常一样,请在不了解正在执行的操作的情况下进行not复制和粘贴脚本,因此此处提供一些详细信息:while循环使用SCAN命令逐页选择键,然后使用每个键然后运行MOVE命令。

SCAN命令将在第一行中返回下一个光标,然后其余的行将成为找到的键。 while循环以未定义的变量CURSOR开始,然后在第一个循环中定义(这是神奇的,只是在下一个CURSOR 0处停止,这将表示扫描结束)

PAGE_SIZE是每个扫描查询将持续多长时间的值,较低的值将对服务器产生非常低的影响,但速度较慢,较大的值将使服务器“发汗”但速度更快...在这里,网络受到影响,因此请尝试在10000甚至50000左右找到一个最佳位置(具有讽刺意味的是,值1或2可能还会给服务器带来压力,但是由于每个查询的网络包装部分)

KEYS_TO_QUERY:这是您要查询的键上的一种模式,例如"*balance*"将选择在键名中包含balance的键(不要忘了包括引号以避免语法错误) ...此外,您可以在脚本端进行过滤,只需使用"*"查询所有键并有条件地添加bash脚本if,这会比较慢,但是如果找不到用于键选择的模式,这将有所帮助。

REDIS_HOST:默认情况下使用本地主机,将其更改为您喜欢的任何服务器(如果您使用的是默认端口6379以外的自定义端口,您还可以将其包含在myredisserver:4739之内)

[SOURCE_DB:您希望键从中移出的数据库ID(默认为0)

TARGET_DB:您希望键移至的数据库ID(默认为1)

注意:

您可以使用此脚本执行其他命令或通过按键进行检查,只需将MOVE命令调用替换为您可能需要的任何内容。
© www.soinside.com 2019 - 2024. All rights reserved.