玖叶教程网

前端编程开发入门

Redis数据库迁移(redis 迁移)

项目开发环境由于服务器切换问题,需要将Redis数据迁移一次,所以写了下边脚本做迁移。

Redis安装采用docker平台,可以看我的另外篇文章docker-compose安装 ,这里以redis安装为例讲解了安装docker-compose。

环境:

  • Ubuntu 20.04
  • python 3.8
  • redis-py 3.5.3

脚本

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import datetime
import logging
import os
import traceback

from redis import StrictRedis

execute_file_name = os.path.basename(__file__).split(".")[0]

logging.basicConfig(filename=execute_file_name+".log",
                    format='%(message)s',
                    filemode='w')
logger = logging.getLogger()
logger.setLevel(logging.INFO)


def move_data(src_host=None, src_port=6379, src_db=0,
              desc_host=None, desc_port=6379, desc_db=0):
    src_redis = StrictRedis(host=src_host, port=src_port,
                            db=src_db, decode_responses=True)
    dest_redis = StrictRedis(host=desc_host, port=desc_port,
                            db=desc_db, decode_responses=True)

    try:
        # 获取所有key
        keys = src_redis.keys()
        for key in keys:
            # key对应的数据类型
            key_type = src_redis.type(key)
            print('\n=====================\nkey:{}'.format(key))
            logger.info('\n=====================\nkey:{}'.format(key))

            # String类型
            if key_type == 'string':
                src_value = str(src_redis.get(key))
                dest_redis.set(key, src_value)
                dest_value = dest_redis.get(key)
                print('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))
                logger.info('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))

            # Hash类型
            elif key_type == 'hash':
                src_value = src_redis.hgetall(key)
                # 遍历field
                for field in src_value:
                    field = str(field)
                    field_value = str(src_redis.hget(key, field))
                    dest_redis.hset(key, field, field_value)
                dest_value = dest_redis.hgetall(key)
                print('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))
                logger.info('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))

            # List类型
            elif key_type == 'list':
                src_value = src_redis.lrange(key, 0, src_redis.llen(key))
                for value in src_value:
                    dest_redis.rpush(key, str(value))
                dest_value = dest_redis.lrange(key, 0, src_redis.llen(key))
                print('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))
                logger.info('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))

            # Set类型
            elif key_type == 'set':
                src_value = src_redis.scard(key)
                for value in src_redis.smembers(key):
                    dest_redis.sadd(key, str(value))
                dest_value = dest_redis.scard(key)
                print('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))
                logger.info('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))

            # ZSet类型
            elif key_type == 'zset':
                src_value = src_redis.zcard(key)
                for value in src_redis.zrange(key, 0, 100):
                    value = str(value)
                    score = src_redis.zscore(key, value)
                    dest_redis.zadd(key, {value: score})
                dest_value = dest_redis.zcard(key)
                print('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))
                logger.info('Moved type:"{}", data{}={} to desc db: {}'.format(
                    key_type, key, src_value, dest_value))
            else:
                print('Dont support key type: {} - {}'.format(key_type, key))
                logger.info('Dont support key type: {} - {}'.format(key_type, key))

            # expire time
            ttl = src_redis.ttl(key)
            if ttl > 0:
                dest_redis.expire(key, ttl)
                print('Expire key:{}, ttl:{}'.format(key, str(ttl)))
                logger.info('Expire key:{}, ttl:{}'.format(key, str(ttl)))

    except Exception as e:
        traceback.print_exc()
        logger.error(traceback.format_exc())


if __name__ == '__main__':
    starttime = datetime.datetime.now()
    print('Begin time: {}'.format(starttime.strftime("%Y-%m-%d %H:%M:%S")))
    logger.info('Begin time: {}'.format(
        starttime.strftime("%Y-%m-%d %H:%M:%S")))

    # 迁移数据
    move_data(
        src_host='192.168.2.32', src_port=6379, src_db=0,
        desc_host='192.168.1.150', desc_port=6379, desc_db=0
    )

    endtime = datetime.datetime.now()
    print('\nEnd time: {}'.format(endtime.strftime("%Y-%m-%d %H:%M:%S")))
    logger.info('\nEnd time: {}'.format(endtime.strftime("%Y-%m-%d %H:%M:%S")))
    print('Using time: {}s'.format((endtime-starttime).seconds))
    logger.info('Using time: {}s'.format((endtime-starttime).seconds))

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言