Skip to content

Instantly share code, notes, and snippets.

@josegonzalez
Forked from iserko/redis_migrate.py
Last active November 4, 2024 19:58
Show Gist options
  • Save josegonzalez/6049a72cb163337a18102743061dfcac to your computer and use it in GitHub Desktop.
Save josegonzalez/6049a72cb163337a18102743061dfcac to your computer and use it in GitHub Desktop.
A simple script to migrate all keys from one Redis to another
#!/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()
@Khachik-IM
Copy link

Thanks a lot. You saved my time 👍 👍 👍 👍

@managedhostingsolution
Copy link

for python3 simple paste () in print methods

@kwach
Copy link

kwach commented Oct 28, 2024

cool. works after fixing a typo :)

print ("Skipping none")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment