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.
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.