-
-
Save josegonzalez/6049a72cb163337a18102743061dfcac to your computer and use it in GitHub Desktop.
| #!/usr/bin/env python | |
| import argparse | |
| import redis | |
| def connect_redis(conn_dict): | |
| conn = redis.StrictRedis(host=conn_dict['host'], | |
| port=conn_dict['port'], | |
| db=conn_dict['db']) | |
| return conn | |
| def conn_string_type(string): | |
| format = '<host>:<port>/<db>' | |
| try: | |
| host, portdb = string.split(':') | |
| port, db = portdb.split('/') | |
| db = int(db) | |
| except ValueError: | |
| raise argparse.ArgumentTypeError('incorrect format, should be: %s' % format) | |
| return {'host': host, | |
| 'port': port, | |
| 'db': db} | |
| def migrate_redis(source, destination): | |
| src = connect_redis(source) | |
| dst = connect_redis(destination) | |
| for key in src.keys('*'): | |
| ttl = src.ttl(key) | |
| # we handle TTL command returning -1 (no expire) or -2 (no key) | |
| if ttl < 0: | |
| ttl = 0 | |
| print("Dumping key: %s" % key) | |
| value = src.dump(key) | |
| if not value: | |
| print("Skipping none") | |
| continue | |
| print("Restoring key: %s" % key) | |
| try: | |
| dst.restore(key, ttl * 1000, value, replace=True) | |
| except redis.exceptions.ResponseError: | |
| print("Failed to restore key: %s" % key) | |
| pass | |
| return | |
| def run(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('source', type=conn_string_type) | |
| parser.add_argument('destination', type=conn_string_type) | |
| options = parser.parse_args() | |
| migrate_redis(options.source, options.destination) | |
| if __name__ == '__main__': | |
| run() |
It was very helpful for me. Thanks for your contribution~!
Thanks for your effort, this saved me π
A cool feature would be to save the dump locally instead of migrating to another redis instance
Just what I was looking for / about to write! As AWS-managed Redis deployments don't let you use MIGRATE >:(
One question though @josegonzalez - why do you set the TTL in the destination multiplied by 1000? i.e. dst.restore(key, ttl * 1000, value, replace=True)
Thanks for your effort! Worked like a charm!
Can
Thanks for your effort, this saved me π
A cool feature would be to save the dump locally instead of migrating to another redis instance
Can you help in editing the script as I am not a devloper and i need to migrate redis data to another redis db
Thanks a lot. You saved my time π π π π
for python3 simple paste () in print methods
cool. works after fixing a typo :)
print ("Skipping none")
very useful thank you!