Valkey: 避免 "Connection Closed by Server" 錯誤

本文件是使用 Python指南的一部分。請在此處查看完整指南:如何將 Valkey 與 Python 連接

👋 歡迎來到 Stackhero 文件!

Stackhero 提供現成的 Valkey cloud 解決方案,帶來多種好處,包括:

  • 包含 Redis Commander 網頁介面
  • 無限制的訊息大小和傳輸。
  • 只需一鍵即可輕鬆更新
  • 專用私有 VM提供的最佳效能和強大安全性

節省時間簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 Valkey cloud hosting 解決方案!

如果您的應用程式在一段時間內未與 Valkey 互動,可能會出現 redis.exceptions.ConnectionError: Connection closed by server 錯誤,導致自動斷開連接。為了避免這種情況,您可以設置 health_check_interval 參數,如下所示:

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
)

使用 Valkey 的 Pub/Sub 功能時,redis-py 庫期望像 get_message()listen() 這樣的函數被調用的頻率高於 health_check_interval。在我們的範例中,我們將此間隔設置為 10 秒,因此請確保至少每 10 秒調用一次 get_message()listen()(參考 redis-py 官方文件)。

如果不這樣做,您可能會遇到相同的連接錯誤。為了避免這種情況,考慮定期調用 check_health()

以下是實現方法:

import redis
import threading

# 連接到 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
)

# 創建一個 PubSub 實例
p = r.pubsub()

# 訂閱頻道 "test"
p.subscribe('test')

# 創建一個函數,每 5 秒調用一次 `check_health`
def valkey_auto_check(p):
  t = threading.Timer(5, valkey_auto_check, [p])
  t.start()
  p.check_health()

# 調用 valkey_auto_check 函數
valkey_auto_check(p)