Redis移动所有键

7

是否可以使用Redis的MOVE命令将一个数据库中的所有键移动到另一个数据库中?MOVE命令只能移动一个键,但我需要移动该数据库中的所有键。

5个回答

3
我建议您查看以下alpha版本的应用程序,以备份和恢复redis数据库。 (您可以通过gem install redis-dump安装它)。 您可以使用redis-dump备份数据库,然后通过--database参数将其加载到另一个数据库中。 redis-dump项目 如果这不符合您的需求,则可能需要使用脚本语言的redis绑定(或者使用bash / redis-cli / xargs等编写一个简单的程序)。 如果您需要沿这些方向的帮助,则我们可能需要更多详细信息。

2

我写了一个小的Python脚本来在两个Redis服务器之间移动数据:(只支持列表和字符串类型,您必须安装Python Redis客户端):

'''
Created on 2011-11-9

@author: wuyi
'''
import redis
from optparse import OptionParser
import time

def mv_str(r_source, r_dest, quiet):
    keys = r_source.keys("*")
    for k in keys:
        if r_dest.keys(k):
            print "skipping %s"%k
            continue
        else:
            print "copying %s"%k
            r_dest.set(k, r_source.get(k))

def mv_list(r_source, r_dest, quiet):
    keys = r_source.keys("*")
    for k in keys:
        length = r_source.llen(k)
        i = 0
        while (i<length):
            print "add queue no.:%d"%i
            v = r_source.lindex(k, i)
            r_dest.rpush(k, v)
            i += 1

if __name__ == "__main__":
    usage = """usage: %prog [options] source dest"""
    parser = OptionParser(usage=usage)

    parser.add_option("-q", "--quiet", dest="quiet",
                      default = False, action="store_true",
                      help="quiet mode")
    parser.add_option("-p", "--port", dest="port",
                      default = 6380,
                      help="port for both source and dest")
    parser.add_option("", "--dbs", dest="dbs",
                      default = "0",
                      help="db list: 0 1 120 220...")
    parser.add_option("-t", "--type", dest="type",
                      default = "normal",
                      help="available types: normal, lpoplist")
    parser.add_option("", "--tmpdb", dest="tmpdb",
                      default = 0,
                      help="tmp db number to store tmp data")

    (options, args) = parser.parse_args()

    if not len(args) == 2:
        print usage
        exit(1)

    source = args[0] 
    dest = args[1]
    if source == dest:
        print "dest must not be the same as source!"
        exit(2)

    dbs = options.dbs.split(' ')
    for db in dbs:
        r_source = redis.Redis(host=source, db=db, password="", port=int(options.port))
        r_dest = redis.Redis(host=dest, db=db, password="", port=int(options.port))
        print "______________db____________:%s"%db
        time.sleep(2)
        if options.type == "normal":
            mv_str(r_source, r_dest, options.quiet)
        elif options.type == "lpoplist":
            mv_list(r_source, r_dest, options.quiet)
        del r_source
        del r_dest

1

你可以尝试我的工具rdd

它是一个命令行实用程序,

可以将数据库转储到文件中,对其进行操作(过滤、匹配、合并等),然后将其还原到redis实例中

请注意,这是alpha阶段,https://github.com/r043v/rdd/


0

现在redis使用lua脚本,你可以轻松编写一个命令来循环遍历所有的键,检查它们的类型并将它们移动到新的数据库中。


1
对于大量的键,这样可能行不通。目前还没有一种方法可以逐步迭代键空间。 SCAN 命令可能是 Redis 2.8 的一部分,但它目前尚不可用。 - Didier Spezia

-3
我建议您可以尝试以下步骤: 1. 将rdb文件复制到另一个目录; 2. 修改rdb文件名; 3. 修改redis配置文件适配器以连接新的数据库;

flushdb会删除所有的键。不好笑。 - Didier Spezia
抱歉,我的英语很差,我误解了Patrick的意思,以为要删除所有键。 - hupantingxue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接