天天看點

redis 使用-->>基數統計算法-HyperLogLog 熱點統計如何做?

文章目錄

    • 為什麼要使用 HyperLogLog?
      • HyperLogLog 介紹
    • 基礎使用
      • 添加元素
        • 相關文法:
      • 統計不重複的元素
        • 相關文法:
      • 合并一個或多個 HLL 至新結構 新增 k 和 k2 合并至新結構 k3 中
        • 相關文法

為什麼要使用 HyperLogLog?

在我們實際開發的過程中,可能會遇到這樣一個問題,當我們需要統計一個大型網站的獨立通路次數時,該用什麼的類型來統計?

如果我們使用 Redis 中的集合來統計,當它每天有數千萬級别的通路時,将會是一個巨大的問題。因為這些通路量不能被清空,我們營運人員可能會随時檢視這些資訊,那麼随着時間的推移,這些統計資料所占用的空間會越來越大,逐漸超出我們能承載最大空間。

例如,我們用 IP 來作為獨立通路的判斷依據,那麼我們就要把每個獨立 IP 進行存儲,以 IP4 來計算,IP4 最多需要 15 個位元組來存儲資訊,例如:110.110.110.110。當有一千萬個獨立 IP 時,所占用的空間就是 15 bit*10000000 約定于 143MB,但這隻是一個頁面的統計資訊,假如我們有 1 萬個這樣的頁面,那我們就需要 1T 以上的空間來存儲這些資料,而且随着 IP6 的普及,這個存儲數字會越來越大,那我們就不能用集合的方式來存儲了,這個時候我們需要開發新的資料類型 HyperLogLog 來做這件事了。

HyperLogLog 介紹

HyperLogLog(下文簡稱為 HLL)是 Redis 2.8.9 版本添加的資料結構,它用于高性能的基數(去重)統計功能,它的缺點就是存在極低的誤差率。

HLL 具有以下幾個特點:

  • 能夠使用極少的記憶體來統計巨量的資料,它隻需要 12K 空間就能統計 2^64 的資料;
  • 統計存在一定的誤差,誤差率整體較低,标準誤差為 0.81%;
  • 誤差可以被設定輔助計算因子進行降低。

基礎使用

HLL 的指令隻有 3 個,但都非常的實用,下面分别來看。

添加元素

127.0.0.1:6379> pfadd key "redis"
(integer) 1
127.0.0.1:6379> pfadd key "java" "sql"
(integer) 1
           
redis 使用-->>基數統計算法-HyperLogLog 熱點統計如何做?

相關文法:

此指令支援添加一個或多個元素至 HLL 結構中。

統計不重複的元素

127.0.0.1:6379> pfadd key "redis"
(integer) 1
127.0.0.1:6379> pfadd key "sql"
(integer) 1
127.0.0.1:6379> pfadd key "redis"
(integer) 0
127.0.0.1:6379> pfcount key
(integer) 2
           
redis 使用-->>基數統計算法-HyperLogLog 熱點統計如何做?

從 pfcount 的結果可以看出,在 HLL 結構中鍵值為 key 的元素,有 2 個不重複的值:redis 和 sql,可以看出結果還是挺準的。

相關文法:

此指令支援統計一個或多個 HLL 結構。

合并一個或多個 HLL 至新結構 新增 k 和 k2 合并至新結構 k3 中

127.0.0.1:6379> pfadd k "java" "sql"
(integer) 1
127.0.0.1:6379> pfadd k2 "redis" "sql"
(integer) 1
127.0.0.1:6379> pfmerge k3 k k2
OK
127.0.0.1:6379> pfcount k3
(integer) 3
           
redis 使用-->>基數統計算法-HyperLogLog 熱點統計如何做?

相關文法