Skip to content

Redis - Keys von einer DB zu einer anderen DB kopieren

Redis
  • Ich hatte bei meinen Python Projekten drei Datenbanken am Start, als Beispiel Redis DB 0, 1, 2
    Nun wollte ich das mal zusammenfassen, da ich das so nicht mehr brauche. Also alle Keys in DB 0. So soll das am Ende aussehen.

    c17e4998-859d-4c6d-bcc5-7ff244b9a817-grafik.png

    settings, stock_list und stocks waren jeweils in einer eigenen DB. Die beiden STRING Werte dienen nur zum Zwischenspeichern, sind hier jetzt mal nicht so wichtig. Nur, wie kopiert man denn nun den KEY aus der einen DB in die andere? Es war eine lange Sitzung mit Chat_GPT da klemmte es doch öfter. Aber, am Ende stand der Erfolg 🙂

    Auf dem Redis Datenbank Server habe ich folgendes Script erstellt.

    #!/bin/bash
    
    # Define Redis host and optional authentication password
    REDIS_HOST="192.168.3.9"
    REDIS_PASSWORD="PASSWORD" # Remove or leave empty if no password
    
    # Function to execute Redis command with optional authentication
    execute_redis_command() {
        if [ -n "$REDIS_PASSWORD" ]; then
            redis-cli -h $REDIS_HOST -a $REDIS_PASSWORD "$@"
        else
            redis-cli -h $REDIS_HOST "$@"
        fi
    }
    
    # Fetch all fields (and their values) from the source hash in database 1
    mapfile -t fields_values < <(execute_redis_command -n 2 HGETALL stock_list)
    
    # Loop through the fields_values array
    # Bash arrays are zero-indexed, fields_values contains field name followed by value, so we increment by 2
    for ((i=0; i<${#fields_values[@]}; i+=2)); do
        field="${fields_values[i]}"
        value="${fields_values[i+1]}"
    
        # Use HSET to insert the field-value pair into the target database (database 0)
        execute_redis_command -n 0 HSET stock_list "$field" "$value"
    done
    
    echo "All fields from DB 1 copied to DB 0 successfully."
    

    Als erstes mal ein Hinweis. Sollten im Passwort Sonderzeichen sein, geht das so nicht. Dann muss man das so lösen.

    redis-cli -h $REDIS_HOST -a 'PASSWORD' "$@"
    

    Ich denke, das sollte als Hinweis reichen. Was macht das Script?

    # Fetch all fields (and their values) from the source hash in database 1
    mapfile -t fields_values < <(execute_redis_command -n 2 HGETALL stock_list)
    

    Wir holen alle Fields und ihre Daten von der Datenbank 1 für den KEY stock_list. Dann loopen wir da durch

    # Use HSET to insert the field-value pair into the target database (database 0)
    execute_redis_command -n 0 HSET stock_list "$field" "$value"
    

    Und hiermit speichern wir dann die Daten in Datenbank 0 unter dem KEY Namen stock_list. Das hat soweit super geklappt, außer das ich immer eine leer Zeile in der Datenbank unter Fields hatte. Hab sie einfach gelöscht. Wenn man mal Langeweile hat, kann man mal suchen warum das so ist 😉

    Am Ende hatte ich dann meine drei Datenbanken alle zu einer zusammengefasst. Eine Sünde aus meiner Anfangszeit ausgebessert. Nun hatte ich ja auch drei Datenbank Klassen, die jeweils die Redis Connection initialisiert hatten. Den dreifachen Code konnte ich auch gut entsorgen. So sah er aus.

    class PortfolioSettings:
    
        def __init__(self, host=config.SERVER_IP, port=6379, db=None):
            if db is None:  # If db is not provided explicitly, use TEST_MODE to decide
                if config.TEST_MODE == 1:
                    db = config.TEST[0]
                else:
                    db = config.LIVE[0]
    
            # Verwende einen Connection Pool
            self.pool = redis.ConnectionPool(
                host=host,
                port=port,
                db=db,
                password=config.REDIS_PASSWORD,
                # Auto-Reconnect einstellen
                retry_on_timeout=True,
                # Optional: Weitere Einstellungen wie maximale Wiederverbindungsversuche,
                # Timeout-Werte, etc. können hier konfiguriert werden
                health_check_interval=30  # Überprüft die Verbindung alle 30 Sekunden
            )
    
            # self.client = redis.StrictRedis(host=host, port=port, db=db, password=config.REDIS_PASSWORD)
            self.client = redis.Redis(connection_pool=self.pool)
    

    Danach so

    class PortfolioSettings:
    
        def __init__(self, connection_pool=config.shared_redis_pool):
            self.client = redis.Redis(connection_pool=connection_pool)
    

    Und unter meiner config.py initialisiere ich das Ganze so.

    # Initialize a single shared connection pool
        shared_redis_pool = redis.ConnectionPool(
            host=redis_host_ip,
            port=6379,
            db=LIVE[0] if TEST_MODE == 0 else TEST[0],
            password=REDIS_PASSWORD,
            retry_on_timeout=True,
            health_check_interval=30
        )
    

    Und wie immer, seid vorsichtig mit dem REDIS Passwort! Auf einem produktiven System danach bitte gut aufräumen. Für mich aktuell nicht so wichtig, der Server läuft hier lokal.

  • Redis Stack?

    Redis
    1
    0 Stimmen
    1 Beiträge
    58 Aufrufe
    Niemand hat geantwortet
  • Redis - Zweite Instanz

    Redis
    1
    0 Stimmen
    1 Beiträge
    171 Aufrufe
    Niemand hat geantwortet
  • RedisInsight

    Redis
    1
    0 Stimmen
    1 Beiträge
    165 Aufrufe
    Niemand hat geantwortet
  • Wenn dir der Redis-Server flöten geht....

    Verschoben Redis
    3
    0 Stimmen
    3 Beiträge
    520 Aufrufe
    FrankMF

    So, nach einer kleinen Pause und ein wenig nachdenken ist mir doch noch was eingefallen 😉

    Backports! Man so einfach!

    nano /etc/apt/sources.list

    Das folgende eintragen.

    # backports deb http://deb.debian.org/debian stretch-backports main

    Danach ein

    apt update

    Und dann schauen wir uns mal die Version an....

    apt -t stretch-backports search redis-server Sorting... Done Full Text Search... Done golang-github-stvp-tempredis-dev/stretch-backports 0.0~git20160122.0.83f7aae-1~bpo9+1 all Go package to start and stop temporary redis-server processes libtest-redisserver-perl/oldstable,oldstable 0.20-1 all redis-server runner for tests python-hiredis/oldstable,oldstable 0.2.0-1+b2 amd64 redis protocol reader for Python 2.X using hiredis python3-hiredis/oldstable,oldstable 0.2.0-1+b2 amd64 redis protocol reader for Python using hiredis redis/stretch-backports 5:5.0.3-3~bpo9+2 all Persistent key-value database with network interface (metapackage) redis-server/stretch-backports 5:5.0.3-3~bpo9+2 amd64 [residual-config] Persistent key-value database with network interface

    Und die habe ich gestern Abend gebaut.

    127.0.0.1:6379> INFO # Server redis_version:5.0.5

    Ok, das schmerzt jetzt 😛

  • Redis Replication

    Angeheftet Verschoben Redis
    4
    1 Stimmen
    4 Beiträge
    421 Aufrufe
    FrankMF

    Um die Verbindung zu testen, kann man folgende Befehle nutzen.

    redis-cli -h 10.1.1.0 -p 6379 -a <PASSWORD>

    und

    telnet 10.1.1.0 6379
  • Redis installieren

    Angeheftet Verschoben Redis
    1
    0 Stimmen
    1 Beiträge
    359 Aufrufe
    Niemand hat geantwortet
  • Redis oder MongoDB?

    Verschoben Redis
    1
    0 Stimmen
    1 Beiträge
    461 Aufrufe
    Niemand hat geantwortet
  • NodeBB & Redis Datenbank vom Server sichern!

    Verschoben Redis
    2
    0 Stimmen
    2 Beiträge
    284 Aufrufe
    FrankMF

    Bei Serverumzug daran denken, das das Passwort der Redis Datenbank in der Konfig

    /etc/redis/redis.conf

    und in der NodeBB Konfig

    /home/user_nodebb/nodebb/config.json

    zu ändern ist.