Redis實(shí)現(xiàn)UV統(tǒng)計(jì)的示例代碼
一、HyperLogLog
1、為什么用HyperLogLog
先介紹兩個(gè)概念:
UV:全稱 Unique Visitor,也叫獨(dú)立訪客量,是指通過(guò)互聯(lián)網(wǎng)訪問(wèn)、瀏覽這個(gè)網(wǎng)頁(yè)的自然人、1 天內(nèi)同一個(gè)用戶多次訪問(wèn)該網(wǎng)站,只記錄 1 次。
PV:全稱 Page View,也叫頁(yè)面訪問(wèn)量或點(diǎn)擊量,用戶每訪問(wèn)網(wǎng)站的一個(gè)頁(yè)面,記錄一次 PV,用戶多次打開(kāi)頁(yè)面,則記錄多次 PV。往往用來(lái)衡量網(wǎng)站的流量。
UV 統(tǒng)計(jì)在服務(wù)端做會(huì)比較麻煩,因?yàn)橐袛嘣撚脩羰欠褚呀?jīng)統(tǒng)計(jì)過(guò)了,需要將統(tǒng)計(jì)過(guò)的用戶信息保存。但是如果每個(gè)訪問(wèn)的用戶都保存到Redis 中,數(shù)據(jù)量會(huì)非??植馈?/p>
那么我們要怎么更好的記錄呢?就用到 HyperLogLog
2、HyperLogLog是什么
HyperLogLog(HLL)是從 Loglog 算法派生的概率算法,用于確定非常大的集合的基數(shù),而不需要存儲(chǔ)其所有值。
Redis 中的 HLL 是基于 String 結(jié)構(gòu)實(shí)現(xiàn)的,單個(gè) HLL 的內(nèi)存永遠(yuǎn)小于 16kb,內(nèi)存占用低的令人發(fā)指!作為代價(jià),其測(cè)量結(jié)果是概率性的,有小于 0.81% 的誤差。不過(guò)對(duì)于 UV 統(tǒng)計(jì)來(lái)說(shuō),這完全可以忽略。
不管加入多少重復(fù)元素,HyperLogLog都只記錄一次,天生適合做uv的統(tǒng)計(jì)

二、實(shí)現(xiàn)UV統(tǒng)計(jì)
我們直接用單元測(cè)試,向 HyperLogLog 中添加 100 萬(wàn)條數(shù)據(jù),看看內(nèi)存占用和統(tǒng)計(jì)效果如何:
@Test
void testHyperLogLog() {
String[] values = new String[1000];
int j = 0;
for (int i = 0; i < 1000000; i++) {
j = i % 1000;
values[j] = "user_" + i;
if(j == 999){
// 發(fā)送到 Redis
stringRedisTemplate.opsForHyperLogLog().add("hl2", values);
}
}
// 統(tǒng)計(jì)數(shù)量
Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2");
System.out.println("count = " + count);
}測(cè)試結(jié)果:
我們統(tǒng)計(jì)出來(lái)的數(shù)據(jù)跟100萬(wàn)非常接近,誤差在0.02。而且發(fā)現(xiàn)內(nèi)存只消耗了14kb非常非常低
到此這篇關(guān)于Redis實(shí)現(xiàn)UV統(tǒng)計(jì)的示例代碼的文章就介紹到這了,更多相關(guān)Redis UV統(tǒng)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis RDB快照持久化及寫操作禁止問(wèn)題排查與解決
本文主要介紹了Redis RDB快照持久化及寫操作禁止問(wèn)題排查與解決,由于?stop-writes-on-bgsave-error?選項(xiàng)處于啟用狀態(tài),所以寫操作被禁止,下面就來(lái)介紹一下,感興趣的可以了解一下2025-04-04
使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜功能
排行榜功能是一個(gè)很普遍的需求。使用 Redis 中有序集合的特性來(lái)實(shí)現(xiàn)排行榜是又好又快的選擇。接下來(lái)通過(guò)本文給大家介紹使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜功能,需要的朋友可以參考下2021-07-07
Redis慢查詢?nèi)罩九c監(jiān)視器問(wèn)題
這篇文章主要介紹了Redis慢查詢?nèi)罩九c監(jiān)視器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
基于?Spring?Aop?環(huán)繞通知實(shí)現(xiàn)?Redis?緩存雙刪功能(示例代碼)
基于 spring aop 常規(guī)應(yīng)用場(chǎng)景多是用于日志記錄以及實(shí)現(xiàn) redis 分布式鎖,在 github 中也有項(xiàng)目是把它拿來(lái)當(dāng)作緩存的異常捕捉,這篇文章主要介紹了基于?Spring?Aop?環(huán)繞通知實(shí)現(xiàn)?Redis?緩存雙刪,需要的朋友可以參考下2022-08-08
Redis高并發(fā)緩存問(wèn)題分析及解決過(guò)程
文章總結(jié)了Redis緩存的六種常見(jiàn)問(wèn)題及其解決方案:緩存穿透、緩存擊穿、緩存雪崩、熱點(diǎn)key重建優(yōu)化、緩存和數(shù)據(jù)庫(kù)雙寫不一致,以及Redis對(duì)過(guò)期key的三種清除策略,每種問(wèn)題都提供了詳細(xì)的原因分析和具體的解決方案2025-01-01
Redis中Zset類型常用命令的實(shí)現(xiàn)
Zset是Redis的一種有序集合數(shù)據(jù)類型,Zset通過(guò)壓縮列表和跳躍表兩種底層編碼方式支持小數(shù)據(jù)集和大數(shù)據(jù)集,支持多種操作,包括添加、查詢、刪除元素以及集合運(yùn)算等,具有不同的時(shí)間復(fù)雜度,感興趣的可以了解一下2024-10-10
Redis緩沖區(qū)溢出是指Redis緩沖區(qū)被寫入的數(shù)據(jù)超過(guò)了它的容量,導(dǎo)致數(shù)據(jù)無(wú)法存儲(chǔ)或被覆蓋。造成緩沖區(qū)溢出的原因可能是快速寫入大量數(shù)據(jù)、緩沖區(qū)未及時(shí)刷新或Redis服務(wù)器配置不當(dāng)?shù)取?/div> 2023-04-04最新評(píng)論

