統計網站在線人數

如何統計網站的在線人數呢?java

首先很簡單的思想就是,若是隻針對會員用戶進行統計,在登陸登出時加判斷,而後維護一個表(或者其餘存儲方式)來存儲在線會員便可。redis

可是有個問題就是,對於正常退出的會員固然可使用這種方式,那若是該會員是關閉了網頁或者停電或者其餘因素,那如何得知這些狀況呢?數據庫

1. 維護在線用戶表

假設使用數據庫來完成這個功能,想要達到最快的速度,就直接使用MYSQL內存表來保存在線會員的記錄,
1:當會員登陸時(包含自動登陸),便去查找該會員是否存在於內存表當中,若是存在,則更新在線表當中的時間,若是不存在,則插入相應數據到內存表當中去

2:在用戶退出時,因爲沒有進行辦法實時的更新,由於用戶有可能直接關閉網頁離開,只能根據時間段來解決這個問題,寫一個計劃任務,每隔半個小時(或者其餘時間),執行一次該程序,該程序主要的做用是掃描當前在線表當中,更新時間是否有小於當前時間10分鐘或者多少分鐘(這個根據具體狀況自定義)的,若是有,則直接刪除該條記錄,這樣便保證了大概的在線人數的統計。服務器

這種作法的缺點,當用戶數量很大時,對數據庫壓力會很大。session

2. 使用Redis統計

將第一種方案的數據庫改爲使用redis,可以減輕數據庫的負擔,讀寫也更快。性能

固然咱們能夠從另外一個角度來看,若是要統計的不單單是會員,要統計來訪問網站的在線人數,咱們能夠考慮保存session(詳情請查看服務器集羣session共享),當session過時時則刪除記錄,相比於第一種方案,這種方案准確率就低了不少,可是性能更好。網站

3. 統計活躍用戶

這裏要提到的另外一種思考是,如何統計網站的活躍用戶呢?(好比把天天都登陸稱爲活躍用戶)spa

假設某網站有1億用戶,就算平均天天登陸3000W用戶,這個數據天天也至關龐大。.net

這裏可使用bitmap來保存用戶登陸情況,由於是否登陸其實就是0/1,因此只用一位來保存就夠了。這樣存儲就大大下降了。code

咱們把天天的用戶登陸信息記錄到一個key中,值中的每一個offset的值就是用戶登陸的標識

(1)設置關鍵字的指定offset的值爲 0 或 1

setbit key 100 1

(2)bit運算

例如

key1 -> 0101
key2 -> 0011

and 運算

bitop and ret key1 key2

就是對 key1 key2 各位進行 and 運算後賦值給 ret,結果爲 0001

or 運算

bitop or ret key1 key2

就是對 key1 key2 各位進行 or 運算後賦值給 ret,結果爲 0111

(3)bit值爲1的數量

bitcount key

經過bit操做就能夠實現用戶統計的需求了

例現在天爲 2016-05-28
把 key 定義爲 userlogin:20160528

(1)用戶登陸

ID爲 100 的用戶登陸了,執行

setbit userlogin:20160118 100 1

(2)統計今天登陸的用戶數

bitcount userlogin:20160118

(3)統計3天內都登陸過的用戶

「都登陸過」是要取得bit值都爲1的,經過 and 計算獲取

bitop or ret userlogin:20160116 userlogin:20160117 userlogin:20160118

(4)統計7天內登陸過的用戶

「登陸過」表示bit值有一個爲 1 便可,因此經過 or 計算獲取

命令與上一個相似

 

Reference:

1. http://bbs.csdn.net/topics/330154127

2. http://blog.edagarli.com/2016/01/20/%E4%BD%BF%E7%94%A8Redis%E7%BB%9F%E8%AE%A1%E6%B4%BB%E8%B7%83%E7%94%A8%E6%88%B7/

相關文章
相關標籤/搜索