【Azure Cache for Redis】Python Djange-Redis連線Azure Redis服務遇上(104, 'Connection reset by peer')

2023-02-03 21:01:13

問題描述

使用Python連線Azure Redis服務,因為在程式碼中使用的是Djange-redis元件,所以通過如下的設定連線到Azure Redis服務:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://xxxxxxxxx.redis.cache.chinacloudapi.cn:6380/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

但是當部署到AKS中後,發現一直報錯 [ERROR][testdjangeredis.py:109]Error while reading from xxxxxxxxx.redis.cache.chinacloudapi.cn:6380 : (104, 'Connection reset by peer')

 

問題解答

檢視Django-redis的官方檔案,對 cache backend 中Location的介紹為:

URL 格式舉例

  1. redis://[:password]@localhost:6379/0
  2. rediss://[:password]@localhost:6380/0
  3. unix://[:password]@/path/to/socket.sock?db=0

支援三種 URL scheme :

  • redis://: 普通的 TCP 通訊端連線
  • rediss://: SSL 包裹的 TCP 通訊端連線
  • unix://: Unix 域通訊端連線

指定資料庫數位的方法:

  • db 查詢引數, 例如: redis://localhost?db=0
  • 如果使用 redis:// scheme, 可以直接將數位寫在路徑中, 例如: redis://localhost/0

 

在仔細對比設定,發現連線Azure Redis的時候使用SSL 6380埠,而Djange-Redis的設定中 scheme 還繼續使用的 redis://,而不是rediss://,所以導致 Connection reset。

為了解決以上問題,直接修改Location設定為:rediss://xxxxxxxxx.redis.cache.chinacloudapi.cn:6380/1 即可!

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "rediss://xxxxxxxxx.redis.cache.chinacloudapi.cn:6380/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

 

 

附錄一:在機器人ChatGPT中尋求 djange_redis 設定答案

問題一:如何設定djange_redis:

 

 

問題二:如何設定Djange_redis的超時時間

問題三:如何設定djange_redis的keep_alive

 

 

問題四:如何啟用djange_redis SSL

 

 

 

問題五:啟用django-redis的SSL並通過6380埠連線範例

 

 

參考資料

django-redis 中文檔案:https://django-redis-chs.readthedocs.io/zh_CN/latest/index.html