Valkey: Vermeidung von "Connection Closed by Server"-Fehlern
Diese Dokumentation ist Teil des Verwendung mit Python-Leitfadens. Den vollständigen Leitfaden finden Sie hier: Wie man Valkey mit Python verbindet.
👋 Willkommen in der Stackhero-Dokumentation!
Stackhero bietet eine einsatzbereite Valkey Cloud Lösung, die zahlreiche Vorteile bietet, darunter:
Redis CommanderWeb-UI inklusive.- Unbegrenzte Nachrichtengröße und Übertragungen.
- Mühelose Updates mit nur einem Klick.
- Optimale Performance und robuste Sicherheit durch eine private und dedizierte VM.
Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Valkey Cloud Hosting Lösung von Stackhero auszuprobieren!
Der Fehler redis.exceptions.ConnectionError: Connection closed by server kann auftreten, wenn Ihre App für eine Weile nicht mit Valkey interagiert, was zu einer automatischen Trennung führt. Um dies zu verhindern, können Sie den Parameter health_check_interval wie unten gezeigt festlegen:
r = redis.from_url(
'rediss://default:<password>@<XXXXXX>.stackhero-network.com:<PORT_TLS>',
health_check_interval=10,
socket_connect_timeout=5,
retry_on_timeout=True,
socket_keepalive=True
)
Bei der Verwendung der Pub/Sub-Funktion von Valkey erwartet die redis-py-Bibliothek, dass Funktionen wie get_message() oder listen() häufiger als das health_check_interval aufgerufen werden. In unserem Beispiel haben wir dieses Intervall auf 10 Sekunden gesetzt, stellen Sie also sicher, dass Sie get_message() oder listen() mindestens einmal alle 10 Sekunden aufrufen (siehe die offizielle redis-py-Dokumentation).
Wenn dies nicht getan wird, könnten Sie auf denselben Verbindungsfehler stoßen. Um dies zu vermeiden, ziehen Sie in Betracht, regelmäßig check_health() aufzurufen.
Hier ist, wie Sie es implementieren können:
import redis
import threading
# Verbindung zu Valkey
r = redis.from_url(
'rediss://default:<password>@<XXXXXX>.stackhero-network.com:<PORT_TLS>',
health_check_interval=10,
socket_connect_timeout=5,
retry_on_timeout=True,
socket_keepalive=True
)
# Erstellen einer PubSub-Instanz
p = r.pubsub()
# Abonnieren des Kanals "test"
p.subscribe('test')
# Erstellen einer Funktion, die `check_health` alle 5 Sekunden aufruft
def valkey_auto_check(p):
t = threading.Timer(5, valkey_auto_check, [p])
t.start()
p.check_health()
# Aufrufen der Funktion valkey_auto_check
valkey_auto_check(p)