我有一個正在運行的django/apache2 + memcached應用程序(ubuntu),並且想跟蹤登錄的在線用戶。在django網絡應用程序中實現「上次看到」功能的最佳方式是什麼?
什麼是最好的跟蹤方式?
我不希望每次登錄用戶加載頁面時都向數據庫寫入數據;但還有什麼其他選擇?
我有一個正在運行的django/apache2 + memcached應用程序(ubuntu),並且想跟蹤登錄的在線用戶。在django網絡應用程序中實現「上次看到」功能的最佳方式是什麼?
什麼是最好的跟蹤方式?
我不希望每次登錄用戶加載頁面時都向數據庫寫入數據;但還有什麼其他選擇?
的方法可能是:
您創建一箇中間件,做對process_response以下餅乾是不存在的,
現在你已經所有當前登錄的用戶在你的auth.User表中該用戶的「LAST_LOGIN」字段的。所有具有比datetime.now() - 間隔(15分鐘)更新的last_login的用戶可能被認爲是「在線」。
大約每10分鐘會爲每個登錄用戶編寫數據庫。根據需要調整值「10」和「15」。
這裏的優點是數據庫寫入很少(根據您的兩個數字設置10/15)。爲了優化速度,請確保last_login已編入索引,因此包含Count的該字段上的過濾器非常快。
希望這會有所幫助。
我喜歡這個想法,除了我不會更新身份驗證。用戶的last_login字段。我會更新用戶配置文件模型或其他模型。 你會如何擴展到未經過身份驗證的用戶?我假設很多機器人不會使用Cookie。您可能需要以某種方式通過IP地址進行跟蹤。 – 2010-06-19 18:58:25
內存中的散列表或隊列,每小時運行一個任務來保存它。
因爲django會話存儲在數據庫中的原因相同,所以不能在django中使用數據庫/持久存儲:可以有多個應用程序正在運行,必須同步它們的狀態+數據通過一個單獨的持久來源[1]
或者,你可能會想要寫一個與用戶ID命名的文件夾中的此信息,然後檢查其創建/修改日期查找所需信息。
Django會話不必存儲在數據庫中。它們可以存儲在緩存中。 – 2010-06-12 17:54:36
您需要堅持信息服務器端,完整性並不重要,吞吐量和延遲非常重要。這意味着你應該使用某種鍵值存儲。
Memcached和redis的密鑰過期。你可能已經安裝了memcached,所以使用它。
您可以在每次訪問時重置user:last-seen:$username
密鑰的到期時間,也可以使用mawimawi的cookie技術,並且有效期爲4 * cookie生存期。
但是,如何從緩存中檢索哪些用戶在線?比如在模板標籤中顯示? – 2010-06-19 18:54:47
我明白OP只希望在用戶縮略圖和個人資料頁面上有一個「在線」燈泡,並且有太多在線用戶可以顯示列表。其他人回答了不同的假設。 – Tobu 2010-06-19 20:21:43
所以你怎麼樣?我會對你自己的解決方案感興趣... – mawimawi 2010-06-14 07:21:11