正常情况下数据迁移,redis作为缓存,数据不需要迁移。
但公司把redis当数据库使用了。所有有了下面的需求。
下面是redis集群数据导出到单节点redis
示例:
import redis
from rediscluster import StrictRedisCluster
'''
redis集群导出
pip install redis==2.10.6
pip install redis-py-cluster==1.3.5
'''
startup_nodes = [
{'host': '10.1.10.41', 'port': 7101},
{'host': '10.1.10.41', 'port': 7102},
{'host': '10.1.10.41', 'port': 7103},
{'host': '10.1.10.42', 'port': 7201},
{'host': '10.1.10.42', 'port': 7202},
{'host': '10.1.10.42', 'port': 7203},
{'host': '10.1.10.43', 'port': 7301},
{'host': '10.1.10.43', 'port': 7302},
{'host': '10.1.10.43', 'port': 7303}
]
old_r = StrictRedisCluster(startup_nodes=startup_nodes, password="Gg8|$JIOsc")
'''
单节点redis导入
'''
new_r = redis.Redis(host='172.20.1.42', port=7101, password="Zli)IJJ4%o", db=0)
c_keys = old_r.keys()
print("------ start ------")
for i in c_keys:
# 过期时间
overdue_time = old_r.pttl(i)
# 判断类型
key_type = old_r.type(i)
if key_type == b'string':
if overdue_time == -1:
new_r.set(name=i, value=old_r.get(i))
elif overdue_time == -2:
print("******不存在******")
else:
new_r.set(name=i, value=old_r.get(i), px=overdue_time)
elif key_type == b'set':
if overdue_time == -1:
new_r.sadd(i, old_r.smembers(i))
elif overdue_time == -2:
print("******不存在******")
else:
new_r.sadd(i, old_r.smembers(i))
new_r.expire(i, overdue_time)
else:
print(key_type+"类型数据未处理!")
print("------ end ------")
单节点redis数据导出到redis集群反之即可。