Redis實現UV統計的示例代碼
一、HyperLogLog
1、為什麼用HyperLogLog
先介紹兩個概念:
UV:全稱 Unique Visitor,也叫獨立訪客量,是指通過互聯網訪問、瀏覽這個網頁的自然人、1 天內同一個用戶多次訪問該網站,隻記錄 1 次。
PV:全稱 Page View,也叫頁面訪問量或點擊量,用戶每訪問網站的一個頁面,記錄一次 PV,用戶多次打開頁面,則記錄多次 PV。往往用來衡量網站的流量。
UV 統計在服務端做會比較麻煩,因為要判斷該用戶是否已經統計過瞭,需要將統計過的用戶信息保存。但是如果每個訪問的用戶都保存到Redis 中,數據量會非常恐怖。
那麼我們要怎麼更好的記錄呢?就用到 HyperLogLog
2、HyperLogLog是什麼
HyperLogLog(HLL)是從 Loglog 算法派生的概率算法,用於確定非常大的集合的基數,而不需要存儲其所有值。
Redis 中的 HLL 是基於 String 結構實現的,單個 HLL 的內存永遠小於 16kb,內存占用低的令人發指!作為代價,其測量結果是概率性的,有小於 0.81% 的誤差。不過對於 UV 統計來說,這完全可以忽略。
不管加入多少重復元素,HyperLogLog都隻記錄一次,天生適合做uv的統計
二、實現UV統計
我們直接用單元測試,向 HyperLogLog 中添加 100 萬條數據,看看內存占用和統計效果如何:
@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){ // 發送到 Redis stringRedisTemplate.opsForHyperLogLog().add("hl2", values); } } // 統計數量 Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2"); System.out.println("count = " + count); }
測試結果:
我們統計出來的數據跟100萬非常接近,誤差在0.02。而且發現內存隻消耗瞭14kb非常非常低
到此這篇關於Redis實現UV統計的示例代碼的文章就介紹到這瞭,更多相關Redis UV統計內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Redis高級數據類型Hyperloglog、Bitmap的使用
- Redis去重的3種不同方法匯總
- SpringBoot集成Redis並實現主從架構的實踐
- Redis生成全局唯一ID的實現方法
- Java與SpringBoot對redis的使用方式