#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'把redis集群中某些key移到另一个集群'
__author__ = 'qiangxie'
from rediscluster import StrictRedisCluster
class RedisKeyMove(object):
def __init__(self, src_nodes, dest_nodes):
redis_nodes = [src_nodes]
self.__r = StrictRedisCluster(startup_nodes=redis_nodes, decode_responses=True, skip_full_coverage_check=True)
redis_nodes2 = [dest_nodes]
self.__r2 = StrictRedisCluster(startup_nodes=redis_nodes2, decode_responses=True, skip_full_coverage_check=True)
'''
移动一些key到另一个集群
'''
def move_key(self, *keys):
for key in keys:
type = self.__r.type(key)
if type == 'string':
self.__r2.set(key, self.__r.get(key))
print(self.__r2.get(key))
elif type == 'set':
for model in self.__r.smembers(key):
self.__r2.sadd(key, model)
print(self.__r2.scard(key))
elif type == 'hash':
self.__r2.hmset(key, self.__r.hgetall(key))
print(self.__r2.hgetall(key))
elif type == 'zset':
map = {}
zset = self.__r.zrange(key, 0, -1, withscores=True)
for item in zset:
map[item[0]] = item[1]
self.__r2.zadd(key, **map)
print(self.__r2.zcard(key))
elif type == 'list':
_ls = self.__r.lrange(key, 0, -1)
for item in _ls:
self.__r2.rpush(key, item)
print(self.__r2.llen(key))
'''
全量key扫描并执行key回调函数
'''
def move_key_by_scan(self, key_patten, count=1000):
keys = list(self.__r.scan_iter(match=key_patten, count=count))
for key in keys:
self.move_key(key)
'''
测试
'''
_nodes = {'host': '10.16.4.108', 'port': 8001}
_nodes2 = {'host': '10.16.4.108', 'port': 8001}
#实例化
key_move_obj = RedisKeyMove(_nodes, _nodes2)
#调用scan将所有key移动到另一个集群
key_move_obj.move_key_by_scan("*", count=10)
另外分享一个不错的专栏