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!

推薦閱讀: