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

时间:2013-12-12 14:09:19

标签: redis

是否有命令将redis密钥从一个数据库移动到另一个数据库,或者只能使用lua脚本编写?

有人问过redis move all keys这类问题,但答案对于像我这样的初学者来说并不恰当和令人信服。

3 个答案:

答案 0 :(得分:4)

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

以下文字来自redis.io

移动密钥数据库

将键从当前选定的数据库(请参阅SELECT)移动到指定的目标数据库。当密钥已存在于目标数据库中,或者在源数据库中不存在时,它不执行任何操作。由于这个原因,可以使用MOVE作为锁定原语。

返回值

整数回复,具体来说:

    如果钥匙被移动,则
  • 1。
  • 如果没有移动钥匙,则
  • 0。

答案 1 :(得分:4)

我认为这将完成这项工作:

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

(1是新的数据库编号,重定向到/ dev / null是为了避免数百万行'1'行 - 因为它会逐个移动键并每次返回1)

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

  

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

因此,转储数据库然后将其导入新数据库可能会更好(也更快)。

答案 2 :(得分: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

重要提示::和往常一样,请不要复制并粘贴脚本,而不要了解正在做什么,因此这里有一些详细信息:

while循环是使用SCAN命令和每个键逐页选择键,然后运行MOVE命令。

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

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

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

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

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

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

您可以使用此脚本执行其他命令或使用键进行检查,只需将MOVE命令调用替换为您可能需要的任何内容。

注意::要将密钥从一台Redis服务器移动到另一台Redis服务器(这不仅在内部数据库之间移动),您可以在此处使用NPM软件包中的redis-utils-cli-> {{ 3}}