日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Redis實現UV統計的示例代碼_Redis

作者:卒獲有所聞 ? 更新時間: 2023-03-25 編程語言

一、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非常非常低

原文鏈接:https://blog.csdn.net/weixin_54232666/article/details/128779000

欄目分類
最近更新