redis移动所有键

时间:2011-03-26 10:43:04

标签: redis

是否可以使用redis的MOVE命令将所有密钥从1个数据库移动到另一个数据库? move命令只移动1个键,但我需要移动数据库中的所有键。

5 个答案:

答案 0 :(得分:3)

我建议您查看以下alpha版应用来备份和恢复redis数据库..(您可以通过gem install redis-dump安装它)。您可以redis-dump您的数据库,然后通过--database参数redis-load到另一个数据库。

redis-dump project

如果这不适合您的目的,您可能需要使用脚本语言的redis绑定(或者使用bash / redis-cli / xargs等将某些东西放在一起)。如果您需要这些方面的帮助,我们可能首先需要更多详细信息。

答案 1 :(得分:1)

我写了一个小的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

答案 2 :(得分:1)

你可以尝试我自己的工具,rdd

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

可以将数据库转储到文件中,对其进行处理(过滤,匹配,合并,...),然后将其备份到redis实例中

小心,alpha阶段,https://github.com/r043v/rdd/

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

我建议你可以尝试如下: 1.将rdb文件复制到另一个目录; 2.修改rdb文件名; 3.将redis configure文件适配器修改为新的db;