微服務Spring Boot 整合 Redis 實現(xiàn)UV 數(shù)據(jù)統(tǒng)計的詳細過程
?引言
本文參考黑馬 點評項目
在各個項目中,我們都可能需要用到UV數(shù)據(jù)統(tǒng)計功能,這樣可以使我們更加方便、快捷的查看網(wǎng)站的活躍度!
一、HyperLoglog基礎用法
?HyperLoglog 基本語法、命令
HyperLogLog
PFADD :將指定元素添加到HyperLogLogPFCOUNT:返回存儲在HyperLogLog結構體的該變量的近似基數(shù),如果該變量不存在,則返回0PFMARGE:將多個 HyperLogLog 合并(merge)為一個 HyperLogLog , 合并后的 HyperLogLog 的基數(shù)接近于所有輸入 HyperLogLog 的可見集合(observed set)的并集.
詳見官網(wǎng): Redis 中文翻譯 官方網(wǎng)站 HyperLogLog
?HyperLoglog 命令完成功能實現(xiàn)
PFADD命令
使用PFADD 添加數(shù)據(jù)
PFCOUNT 統(tǒng)計
- 得到基數(shù)值,白話就叫做去重值(1,1,2,2,3, 3)的插入pfcount得到的是3
- 可一次統(tǒng)計多個key
- 時間復雜度為O(N),N為key的個數(shù)
- 返回值是一個帶有 0.81% 標準錯誤(standard error)的近似值.
使用PFCOUNT查詢
PFMERGE 合并
合并key
HyperLogLog 的應用場景
- 基數(shù)不大的、數(shù)據(jù)量不大就用不上。
- 有局限性,就是只能統(tǒng)計基數(shù)數(shù)量,沒辦法統(tǒng)計具體的內(nèi)容
- 和BitMap相比,屬于兩種特定統(tǒng)計情況,HyperLogLog比 BitMap去重方便很多
- HyperLogLog 可以 與 BitMap 配合使用,BitMap標識那些用戶活躍,HyperLogLog計數(shù)
二、UV統(tǒng)計 測試百萬數(shù)據(jù)的統(tǒng)計
??什么是UV統(tǒng)計
- UV:全稱Unique Visitor,也叫獨立訪客量,是指通過互聯(lián)網(wǎng)訪問、瀏覽這個網(wǎng)頁的自然人。1天內(nèi)同一個用戶多次訪問該網(wǎng)站,只記錄1次。
- PV:全稱Page View,也叫頁面訪問量或點擊量,用戶每訪問網(wǎng)站的一個頁面,記錄1次PV,用戶多次打開頁面,則記錄多次PV。往往用來衡量網(wǎng)站的流量。
通常來說 UV 會比 PV 大很多,一個網(wǎng)站的獨立訪客量 和 頁面訪問或點擊量,肯定是獨立訪客大的。
UV統(tǒng)計在服務端做會比較麻煩,因為要判斷該用戶是否已經(jīng)統(tǒng)計過了,需要將統(tǒng)計過的用戶信息保存。但是如果每個訪問的用戶都保存到Redis中,數(shù)據(jù)量會非??植?,那怎么處理呢?
Hyperloglog(HLL)是從Loglog算法派生的概率算法,用于確定非常大的集合的基數(shù),而不需要存儲其所有值。
Redis 中的HLL 是基于string數(shù)據(jù)結構實現(xiàn)的,單個HLL的內(nèi)存永遠小于16kb, 內(nèi)存極低!作為代價,其測量結果是概率性的,有小于0.81%的誤差。不過對于UV統(tǒng)計來說,這完全可以忽略。
?使用SpringBoot單元測試進行測試百萬數(shù)據(jù)統(tǒng)計
首先進入Redis 查看 內(nèi)存占用
info memory
核心源碼
@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); }
執(zhí)行后,如下圖
再次查看內(nèi)存占比
可以看出占用大約為14KB,存儲上百萬數(shù)據(jù)只占用了14KB數(shù)據(jù),可見HyperLogLog的強大!
?小結
以上就是【Bug 終結者】對 微服務Spring Boot 整合 Redis 實現(xiàn) UV 數(shù)據(jù)統(tǒng)計 的簡單介紹,UV數(shù)據(jù)統(tǒng)計功能是很常用的,在項目中,是一個不錯的亮點,統(tǒng)計功能也是各大系統(tǒng)中比較重要的功能,簽到完成后,去統(tǒng)計本月的連續(xù) 簽到記錄,來給予獎勵,可大大增加用戶對系統(tǒng)的活躍度,HyperLogLog可以與BitMap相結合,從而能夠能高效的對網(wǎng)站進行深層次的分析! 技術改變世界?。?!
到此這篇關于微服務Spring Boot 整合 Redis 實現(xiàn) UV 數(shù)據(jù)統(tǒng)計的文章就介紹到這了,更多相關Spring Boot UV 數(shù)據(jù)統(tǒng)計內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot通過Junit實現(xiàn)單元測試過程解析
這篇文章主要介紹了Spring Boot通過Junit實現(xiàn)單元測試過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01java多線程開發(fā)之通過對戰(zhàn)游戲?qū)W習CyclicBarrier
這篇文章給大家分享了關于java多線程開發(fā)中通過對戰(zhàn)游戲?qū)W習CyclicBarrier的相關知識點內(nèi)容,有興趣的朋友們學習參考下。2018-08-08