是否有将Redis密钥从一个数据库移动到另一个数据库的命令,或者仅通过lua脚本可以实现吗?
曾经有人问过这种类型的问题redis move all keys,但答案并不恰当,这对于像我这样的初学者来说是很有说服力的。
我认为这可以完成工作:
redis-cli keys '*' | xargs -I % redis-cli move % 1 > /dev/null
((1是新的数据库号,并且重定向到/ dev / null是为了避免获得数以百万计的'1'行,因为它将逐个移动键并每次返回1)]
请注意redis可能会耗尽连接,然后会显示大量此类错误:
无法通过127.0.0.1:6379连接到Redis:无法分配请求的地址
因此,仅转储数据库,然后将其导入到新数据库中会更好(更快)。
您可以使用“ MOVE”将一个键移动到另一个Redis数据库;
下面的文字来自redis.io
MOVE key db
将密钥从当前选定的数据库(请参见SELECT)移动到指定的目标数据库。如果目标数据库中已经存在密钥,或者源数据库中不存在密钥,则它什么也不做。因此,可以将MOVE用作锁定原语。
返回值
整数回复,特别是:
[如果您有一个拥有数百万个键的大型数据库,则可以使用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
命令调用替换为您可能需要的任何内容。