HyperLogLog和上一篇的bitmaps都是redis新支持的兩種數據結構,不同於5種常用結構。這兩種數據結構在特定場景下非常有用。比如用bitmaps來記錄簽到。用HyperLogLog來統計uv。

設想一下,你需要統計網站頁面的pv和uv。pv比較簡單,爲每個頁面建一個計數器,計數器的key後綴加上日期。每次有請求,計數器incrby一次即可。

但對於uv就不是那麼簡單了,因爲uv要去重。一個用戶多次訪問同一個頁面是隻算一次的。提到去重,我們自然會想到set結構。爲每個頁面建一個set,有用戶訪問就sadd一下,最後統計一下總數。雖然可行,但是如果是用戶超多,那這個佔據的內存將很大。我們的目標又不需要知道登錄的每一個用戶id,這其實很浪費。而且uv這種數據並不需要非常精確。在這種場景下,HyperLogLog 數據結構就非常適合了。HyperLogLog 提供不精確的去重計數方案,雖然不精確但是也不是非常不精確,標準誤差是 0.81%,這樣的精確度已經可以滿足上面的 UV 統計需求了。

HyperLogLog 只需要佔用12k的存儲空間

用法:

HyperLogLog 提供了兩個指令 pfadd 和 pfcount,根據字面意義很好理解,一個是增加計數,一個是獲取計數。pfadd 用法和 set 集合的 sadd 是一樣的,來一個用戶 ID,就將用戶 ID 塞進去就是。pfcount 和 scard 用法是一樣的,直接獲取計數值。

HyperLogLog 除了上面的 pfadd 和 pfcount 之外,還提供了第三個指令 pfmerge,用於將多個 pf 計數值累加在一起形成一個新的 pf 值。 比如在網站中我們有兩個內容差不多的頁面,運營說需要這兩個頁面的數據進行合併。其中頁面的 UV 訪問量也需要合併,那這個時候 pfmerge 就可以派上用場了

這個 pf 是什麼意思?

它是 HyperLogLog 這個數據結構的發明人 Philippe Flajolet 的首字母縮寫,老師覺得他髮型很酷,看起來是個佛系教授。

HyperLogLog 算法的數學原理是:

給定一系列的隨機整數,我們記錄下低位連續零位的最大長度 k,通過這個 k 值可以估算出隨機數的數量。

查看原文 >>
相關文章