暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分享一个将一个redis集群中的某些key移到到另一个集群的脚本

小白懂编程 2018-08-05
231

#!/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)

另外分享一个不错的专栏