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.

  • FreeOTP+ Datenumzug nach Bitwarden Authenticator

    Python3
    1
    0 Stimmen
    1 Beiträge
    124 Aufrufe
    Niemand hat geantwortet
  • Redis Insight - Desktop UI

    Redis
    1
    0 Stimmen
    1 Beiträge
    104 Aufrufe
    Niemand hat geantwortet
  • Update v2.2.2

    NodeBB
    1
    0 Stimmen
    1 Beiträge
    79 Aufrufe
    Niemand hat geantwortet
  • Redis - Sicherheitsupdate Debian

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

    Redis
    2
    0 Stimmen
    2 Beiträge
    861 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
  • Portainer - NodeBB Container erstellen

    Linux
    1
    0 Stimmen
    1 Beiträge
    319 Aufrufe
    Niemand hat geantwortet
  • Redis Replication über Wireguard

    Redis
    5
    0 Stimmen
    5 Beiträge
    419 Aufrufe
    K

    👍
    spart bischen zeit

  • Wenn dir der Redis-Server flöten geht....

    Verschoben Redis
    3
    0 Stimmen
    3 Beiträge
    546 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 😛