Redis如何統(tǒng)計用戶訪問量
Redis統(tǒng)計用戶訪問量
1. 使用Hash
哈希作為Redis
的一種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),Redis
底層維護(hù)的是一個開散列,會把不同的key值映射到哈希表 上,如果是遇到關(guān)鍵字沖突,那么就會拉出一個列表出來。
當(dāng)一個用戶訪問時,如果用戶登陸過,那么我們就使用用戶的id,如果用戶沒有登陸過,那么也可以在前端頁面隨機(jī)生成一個key
用來標(biāo)識用戶,當(dāng)用戶訪問的時候,我們可以使用HSET命令,key
可以選擇URI
與對應(yīng)的日期進(jìn)行拼湊,field
則可以使用用戶的id或者隨機(jī)標(biāo)識,value
則可以簡單設(shè)置為1。
當(dāng)要訪問一個網(wǎng)站某一天的訪問量時,就可以直接使用HLEN來獲取結(jié)果;
優(yōu)點(diǎn):簡單,易實(shí)現(xiàn).查詢方便,并且數(shù)據(jù)精準(zhǔn)性非常好.
缺點(diǎn):內(nèi)存占用過大.隨著key
的增多,性能會隨之下降.無法支撐大規(guī)模的訪問量.
2. 使用Bitset
對于個int型的數(shù)來說,若用來記錄id,則只能記錄一個,而若轉(zhuǎn)換為二進(jìn)制存儲,則可以表示32個,空間的利用率提升了32倍.對于海量數(shù)據(jù)的處理,這樣的存儲方式會節(jié)省很多內(nèi)存空間.對于未登陸的用戶,可以使用Hash算法,把對應(yīng)的用戶標(biāo)識哈希為一個數(shù)字id.對于一億個數(shù)據(jù)來說,我們也只需要1000000000/8/1024/1024大約12M空間左右.
而Redis
已經(jīng)為我們提供了SETBIT的方法,使用起來非常的方便,我們在item頁面可以不停地使用SETBIT命令,設(shè)置用戶已經(jīng)訪問了該頁面,也可以使用GETBIT的方法查詢某個用戶是否訪問。最后通過BITCOUNT統(tǒng)計該網(wǎng)頁每天的訪問數(shù)量。
優(yōu)點(diǎn):占用內(nèi)存更小,查詢方便,可以指定查詢某個用戶,對于非登陸的用戶,可能不同的key映射到同一個id,否則需要維護(hù)一個非登陸用戶的映射,有額外的開銷。
缺點(diǎn):如果用戶過于稀疏,則占用的內(nèi)存可能比第一個方法更大
3. 使用概率算法
對于一個網(wǎng)站頁面若訪問量非常大的話,如果要求的數(shù)量不是很高,可以考慮使用概率算法。
在Redis中,已經(jīng)對HyperLogLog算法做了封裝,這是一種基數(shù)評估算法:不存儲具體數(shù)值,只是存儲用來計算概率的一些相關(guān)數(shù)據(jù)。
當(dāng)用戶訪問網(wǎng)站的時候,可以使用PFADD命令,設(shè)置對應(yīng)的命令,最后我們只要通過PFCOUNT順利計算出最終的結(jié)果,因為這是一個概率算法,所以可能存在一定的誤差。
優(yōu)點(diǎn):占用內(nèi)存極小,對于一個key,只需要12kb。對于超大規(guī)模數(shù)據(jù)訪問量的網(wǎng)站效率極高
缺點(diǎn):查詢指定用戶的時候,可能會出錯。在總數(shù)統(tǒng)計時也不一定十分精準(zhǔn).
使用Redis做某個時間段在線數(shù)統(tǒng)計
一般有范圍性的需求都可以使用 sorted set 實(shí)現(xiàn)。
sorted set 類型通常用于實(shí)現(xiàn)(排行榜,最新的xxx,延遲隊列…)
實(shí)現(xiàn)
實(shí)現(xiàn)很簡單,將用戶的登錄時間轉(zhuǎn)換成時間戳作為權(quán)重即可。
假設(shè)用戶1,3 在20220801號登錄
zadd login 1659283200 1 zadd login 1659283200 3
假設(shè)用戶2,3 在20220802號登錄
zadd login 1659369600 2 zadd login 1659369600 3
假設(shè)用戶4,在20220803號登錄
zadd login 1659456000 4
統(tǒng)計20220801至20220802的在線用戶數(shù)量
# ZCOUNT key min max # 在線 3 zcount login 1659283200 1659369600
拓展:在上面的基礎(chǔ)上統(tǒng)計連續(xù)兩天都在線的用戶及其最后登錄時間
假設(shè)用戶1,3 在20220801號登錄
zadd login:20220801 1659283200 1 zadd login:20220801 1659283200 3
假設(shè)用戶2,3 在20220802號登錄
zadd login:20220802 1659369600 2 zadd login:20220802 1659369600 3
假設(shè)用戶4,在20220803號登錄
zadd login:20220803 1659456000 4
統(tǒng)計20220801,20220802 兩天都登錄的用戶及其最后登錄時間
# 將兩個交集保存至 result:20220801:20220802 # aggregate max 保留最大的權(quán)重(即最后登錄時間) # 不使用 aggregate max,權(quán)重會累加 zinterstore result:20220801:20220802 2 login:20220801 login:20220802 aggregate max # 展示數(shù)據(jù) zrange result:20220801:20220802 0 -1 withscores
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Redis中統(tǒng)計各種數(shù)據(jù)大小的方法
- 利用Redis統(tǒng)計網(wǎng)站在線活躍用戶的方法
- PHP使用redis位圖bitMap 實(shí)現(xiàn)簽到功能
- java redis 實(shí)現(xiàn)簡單的用戶簽到功能
- SpringBoot使用Redis的zset統(tǒng)計在線用戶信息
- 基于Redis位圖實(shí)現(xiàn)用戶簽到功能
- Redis基于Bitmap實(shí)現(xiàn)用戶簽到功能
- SpringBoot整合Redis實(shí)現(xiàn)訪問量統(tǒng)計的示例代碼
- 微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計功能
- PHP利用redis位圖實(shí)現(xiàn)簡單的簽到功能
- SpringBoot+Redis?BitMap實(shí)現(xiàn)簽到與統(tǒng)計的項目實(shí)踐
相關(guān)文章
Redis數(shù)據(jù)庫中實(shí)現(xiàn)分布式鎖的方法
這篇文章主要介紹了Redis數(shù)據(jù)庫中實(shí)現(xiàn)分布式鎖的方法,Redis是一個高性能的主存式數(shù)據(jù)庫,需要的朋友可以參考下2015-06-06Redis過期時間的設(shè)計與實(shí)現(xiàn)代碼
在?Redis?中,鍵的過期時間設(shè)計與實(shí)現(xiàn)是一個重要的功能,這使得?Redis?可以自動刪除在指定時間后不再需要的鍵,下面詳細(xì)介紹?Redis?過期時間的設(shè)計和實(shí)現(xiàn),包括設(shè)置過期時間、過期鍵的存儲結(jié)構(gòu)、過期鍵的刪除策略等,需要的朋友可以參考下2024-08-08Redis緩存數(shù)據(jù)庫表(列單獨(dú)緩存)的示例代碼
在Redis中緩存數(shù)據(jù)庫表數(shù)據(jù),而不使用JSON結(jié)構(gòu)來表示value,通常意味著我們會將數(shù)據(jù)庫表的每一行數(shù)據(jù)映射為Redis中的一個或多個鍵值對,這篇文章主要介紹了Redis緩存數(shù)據(jù)庫表(列單獨(dú)緩存),需要的朋友可以參考下2024-03-03Redis序列化設(shè)置以及jetcache連接Redis序列化的設(shè)置過程
這篇文章主要介紹了Redis序列化設(shè)置以及jetcache連接Redis序列化的設(shè)置過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot讀寫Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能
這篇文章主要介紹了SpringBoot讀寫Redis客戶端并實(shí)現(xiàn)技術(shù)切換功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01