Redis實現(xiàn)UV統(tǒng)計的示例代碼
一、HyperLogLog
1、為什么用HyperLogLog
先介紹兩個概念:
UV:全稱 Unique Visitor,也叫獨立訪客量,是指通過互聯(lián)網(wǎng)訪問、瀏覽這個網(wǎng)頁的自然人、1 天內(nèi)同一個用戶多次訪問該網(wǎng)站,只記錄 1 次。
PV:全稱 Page View,也叫頁面訪問量或點擊量,用戶每訪問網(wǎng)站的一個頁面,記錄一次 PV,用戶多次打開頁面,則記錄多次 PV。往往用來衡量網(wǎng)站的流量。
UV 統(tǒng)計在服務(wù)端做會比較麻煩,因為要判斷該用戶是否已經(jīng)統(tǒng)計過了,需要將統(tǒng)計過的用戶信息保存。但是如果每個訪問的用戶都保存到Redis 中,數(shù)據(jù)量會非??植?。
那么我們要怎么更好的記錄呢?就用到 HyperLogLog
2、HyperLogLog是什么
HyperLogLog(HLL)是從 Loglog 算法派生的概率算法,用于確定非常大的集合的基數(shù),而不需要存儲其所有值。
Redis 中的 HLL 是基于 String 結(jié)構(gòu)實現(xiàn)的,單個 HLL 的內(nèi)存永遠(yuǎn)小于 16kb,內(nèi)存占用低的令人發(fā)指!作為代價,其測量結(jié)果是概率性的,有小于 0.81% 的誤差。不過對于 UV 統(tǒng)計來說,這完全可以忽略。
不管加入多少重復(fù)元素,HyperLogLog都只記錄一次,天生適合做uv的統(tǒng)計
二、實現(xiàn)UV統(tǒng)計
我們直接用單元測試,向 HyperLogLog 中添加 100 萬條數(shù)據(jù),看看內(nèi)存占用和統(tǒng)計效果如何:
@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)計數(shù)量 Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2"); System.out.println("count = " + count); }
測試結(jié)果:
我們統(tǒng)計出來的數(shù)據(jù)跟100萬非常接近,誤差在0.02。而且發(fā)現(xiàn)內(nèi)存只消耗了14kb非常非常低
到此這篇關(guān)于Redis實現(xiàn)UV統(tǒng)計的示例代碼的文章就介紹到這了,更多相關(guān)Redis UV統(tǒng)計內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis報錯“NOAUTH Authentication required”兩種解決方案
Redis提供了一個命令行工具redis-cli,它允許你直接連接到Redis服務(wù)器,如果你知道Redis服務(wù)器的密碼,你可以在連接時直接提供它,本文給大家介紹連接了Redis報錯“NOAUTH Authentication required”兩種解決方案2024-05-05redis 億級數(shù)據(jù)讀取的實現(xiàn)
本文主要介紹了redis 億級數(shù)據(jù)讀取的實現(xiàn),億級數(shù)據(jù)規(guī)模下實現(xiàn)高效的數(shù)據(jù)讀取成為了許多企業(yè)和開發(fā)者面臨的重大挑戰(zhàn),下面就來介紹一下,感興趣的可以了解一下2024-08-08Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案
本文主要介紹了Redis高并發(fā)防止秒殺超賣實戰(zhàn)源碼解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10linux 常見的標(biāo)識與Redis數(shù)據(jù)庫詳解
這篇文章主要介紹了linux 常見的標(biāo)識與Redis數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10