獲取用戶下線時間的實現思路

最近做一個項目,需要記錄用戶的登錄歷史信息,其中在用戶下線時間的獲取上遇到了困難,用戶登出網頁的方法有三種:
1、使用網站提供的登出功能
2、直接關閉網頁
3、直接關閉瀏覽器、突然斷電等

如果用戶正常登出,可以直接new Date()獲取當前時間,在退出成功後保存相關數據;如果用戶關閉網頁退出,可以使用js捕捉頁面關閉事件;獨獨在直接關閉瀏覽器、突然斷電這裏,大家都知道,如果客戶端不發送任何請求,後臺就無法判定用戶狀態。在網上找了很多關於抓取用戶下線時間的方法,其中包括使用監聽器監聽session,設置會話超時時間,當會話創建、銷燬時做出相應操作,但是這個方法獲得的時間不準確,會話超時時間設置太低,頻繁的登錄影響用戶體驗。還有一個方法就是通過心跳檢測用戶的在線狀態,在前臺設置一個定時器,從用戶登錄開始發送請求,當用戶離開網站時,定時器就會停止,自然能獲得一個相對準確的下線時間。本人採用的便是心跳檢測的方法,下面來說說實現方式:
單純的心跳檢測就是給前臺提供一個接口,每接收到一次請求就更新一次最後在線時間,但是這種做法非常消耗資源,所以我使用的是緩存代替數據庫的作用的方法(緩存的好處就是加快訪問速度,減少資源的浪費),將登錄用戶的登錄信息放入緩存,客戶端定時器每一次請求都根據唯一標識更新一遍緩存,無論用戶是否正常登出,都不會繼續執行前臺頁面定時器,緩存中對應該用戶的信息就是最終登錄信息。當然,無論使用何種方式獲得TA的信息,最終都要把數據放入數據庫,而緩存中這時會同時存在在線用戶和下線用戶,我們即需要把下線這部分用戶的登錄信息放入數據庫,我們如何知道什麼時候需要把下線用戶的登錄信息放入數據庫呢?在這裏就需要在服務器同樣設置一個定時器,定時從緩存中將用戶登錄信息拿出來,判斷哪些用戶長時間沒有更新過緩存,這些便是下線用戶,將他們保存至數據庫並移出緩存即可。

上述方法不僅解決了我的需求,並且時間誤差可以壓縮到自己能接受的最低程度,不過並不建議將頁面定時器和服務器定時器的時間間隔設置的太短,否則當會極大的增加服務器的壓力。另,這個方法也存在一定的漏洞,即當用戶的登錄間隔小於服務器定時器的時間間隔時,會出現用戶一直在線上的情況。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章