文章目錄
-
- 為什麼要使用 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
相關文法:
此指令支援添加一個或多個元素至 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
從 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