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.

  • Flask - Erste Schritte

    Allgemeine Diskussionen
    3
    1
    0 Stimmen
    3 Beiträge
    236 Aufrufe
    FrankMF
    Mein vorhandenes Projekt war doch etwas größer als ich gedacht hatte. Also musste ich mehr Zeit aufwenden um es nach Flask zu transferieren. Nach einiger Zeit hatte sich eine ganz ansehnliche Zahl von Dateien angesammelt und es kam wie es kommen musste, ich wusste manchmal nicht mehr, welches File ich anfassen musste. Chaos kam auf So fing ich an ein wenig zu recherchieren und kam auf die Funktion Blueprint von Flask. Mich ein wenig eingelesen, ChatGPT mal eben um ein Beispiel gebeten und dann angefangen die Applikation entsprechend umzubauen. Auch das hat Zeit gekostet. Aber, jetzt habe ich ein aufgeräumtes Projekt, was es mir wesentlich einfacher macht, daran zu arbeiten. [image: 1697954135081-5226e90d-aa20-4b20-93af-e50f8f841880-grafik.png] Wenn ihr also mal vorhabt, so was zu coden, halte ich es für sinnvoll das Projekt von Anfang an zu strukturieren. Und zum Schluss noch ein Screenshot zum Stand des Projektes. [image: 1697954267467-a7981ffc-0f93-41f4-93e2-c914fdba5e43-grafik.png] Und weiter geht es, ist nämlich noch nicht fertig
  • Redis - Fehler bei apt update && apt upgrade

    Redis
    1
    0 Stimmen
    1 Beiträge
    200 Aufrufe
    Niemand hat geantwortet
  • NodeBB - Zwei Instanzen

    Angeheftet NodeBB
    1
    0 Stimmen
    1 Beiträge
    122 Aufrufe
    Niemand hat geantwortet
  • Redis - Zweite Instanz

    Redis
    1
    0 Stimmen
    1 Beiträge
    261 Aufrufe
    Niemand hat geantwortet
  • Redis - Datenbank extern

    Redis
    2
    0 Stimmen
    2 Beiträge
    903 Aufrufe
    FrankMF
    Das habe ich doch oben vergessen reinzuschreiben, also wenn man das mal von extern testen muss um zu schauen ob die Verbindung geht. Keine Firewall blockt usw. dann kann man das ganz einfach so machen. root@webserver:~# redis-cli -h 10.10.1.10 -p 6379 10.10.1.10:6379> quit
  • Redis Replication über Wireguard

    Redis
    5
    0 Stimmen
    5 Beiträge
    466 Aufrufe
    K
    spart bischen zeit
  • RedisInsight

    Redis
    1
    4
    0 Stimmen
    1 Beiträge
    196 Aufrufe
    Niemand hat geantwortet
  • Redis startet nicht!?

    Verschoben Redis
    1
    0 Stimmen
    1 Beiträge
    376 Aufrufe
    Niemand hat geantwortet