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 mit zahlreichen Vorteilen, darunter:
Valkey AdminWeb-Oberfläche inklusive.- Unbegrenzte Nachrichtengröße und Übertragungen.
- Updates ganz einfach per Klick.
- Optimale Performance und starke Sicherheit durch eine private, dedizierte Infrastruktur.
Sparen Sie Zeit und vereinfachen Sie Ihren Alltag: 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)