项目开发环境由于服务器切换问题,需要将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))