Django 效能提升:為 Session 使用獨立的 Memcached

學習如何透過為 session 管理實作獨立的 Memcached 實例來顯著提升 Django 的效能,防止在快取重整時用戶登出。

作為 Django 開發者,我們經常遇到效能瓶頸,特別是在處理 session 管理時。以資料庫為基礎的 session 可能會顯著降低應用程式的速度。雖然 Memcached 提供了一個解決方案,但它也帶來了自己的挑戰:在伺服器重啟或快取重整時丟失 session 資料。在這篇文章中,我將向您展示如何透過使用兩個獨立的 Memcached 實例來克服這個問題 - 一個用於常規 Python 物件,另一個專門用於 session 資料。

單一 Memcached 實例的問題

當使用單一 Memcached 實例同時處理一般快取和 session 時,重啟伺服器或清除快取會導致所有用戶登出。這會造成糟糕的用戶體驗,對高流量網站來說尤其問題嚴重。

解決方案:雙 Memcached 設置

透過為 session 實作獨立的 Memcached 實例,我們可以在清除主要快取時仍保持用戶 session。以下是設置方法:

  1. 在您的專案目錄中創建兩個新檔案:

檔案 1:session_backend.py

這個檔案是 Django 的 contrib/sessions/backends/cache.py 的修改版本:

1
2
3
4
5
from django.contrib.sessions.backends.base import SessionBase, CreateError
from yourproject.session_cache import cache

class SessionStore(SessionBase):
    # ... [其餘代碼與原始文章相同]

檔案 2:session_cache.py

這個檔案初始化 session 的獨立快取:

1
2
3
4
5
6
from django.core.cache.backends.memcached import CacheClass
from django.conf import settings

scheme, rest = settings.SESSION_CACHE.split(':', 1)
host = rest[2:-1]
cache = CacheClass(host, {})
  1. 更新您的 settings.py
1
2
SESSION_ENGINE = "yourproject.session_backend"
SESSION_CACHE = 'memcached://127.0.0.1:11200/'
  1. 在端口 11200 上啟動新的 Memcached 實例。

這種方法的好處

  1. 提升效能:Session 現在在記憶體中管理,比資料庫查詢快得多。
  2. 用戶 Session 持久性:即使清除主應用程式快取,用戶仍保持登入狀態。
  3. 可擴展性:分離 session 儲存允許更容易擴展您的快取基礎設施。

實作提示

  • 確保您的 Memcached 實例得到適當的安全保護,特別是在單獨的伺服器上運行時。
  • 監控您的 session Memcached 實例的記憶體使用情況,以防溢出。
  • 考慮實作 session 過期政策來管理長時間不活動的 session。

透過實作這種雙 Memcached 設置,您會注意到 Django 應用程式的效能和用戶體驗有顯著改善。關注點的分離允許更靈活的快取管理,而不會中斷用戶 session。

您是否已實作這個解決方案或有任何問題?歡迎聯繫我:[email protected]。我總是很興奮能討論 Django 優化並幫助其他開發者改進他們的應用程式。

祝編碼愉快,願您的 Django 應用程式永遠快速穩定!

Writing about the internet