介紹
Redis 在 2.8.9 版本添加了 HyperLogLog 結構,Redis HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、並且是很小的。在 Redis 裏面,每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。但是,因爲 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以HyperLogLog不能像集合那樣,返回輸入的各個元素。
基數
比如數據集 {1, 3, 5, 7, 5, 7, 8}, 那麼這個數據集的基數集爲 {1, 3, 5 ,7, 8}, 基數(不重複元素)爲5。 基數估計就是在誤差可接受的範圍內,快速計算基數。
命令:
添加元素: pfadd key element ...
獲取基數估算值: pfcount key ..
將多個HyperLogLog 合併爲一個:pfmerge destkey sourcekey1 sourcekey2 ....
pfadd pfkey 1 2 3 4 (integer) 1
pfadd pfkey 45
(integer) 1
pfcount pfkey
(integer) 5
pfadd pf1key 34 45 76
(integer) 1
pfmerge destkey pfkey pf1key
OK
pfcount destkey
(integer) 7
應用場景
統計註冊 IP 數 / 統計每日訪問 IP 數 / 統計頁面實時 UV 數 / 統計在線用戶數等
注意:它也有侷限性,就是隻能統計基數數量,而沒辦法去知道具體的內容是什麼。
它和bitmap相比,屬於兩種特定統計情況,簡單來說,HyperLogLog 去重比 bitmap 方便很多。
統計訪問 IP 數
用命令PFCOUNT 求得的ip數量,直接去重了,簡單直接,非常棒。
PFADD ip_date1 "ip1" "ip2" "ip3"
PFCOUNT ip_date1
(integer) 3
PFADD ip_date2 "ip1"
(integer) 1
PFCOUNT ip_date1 ip_date2
(integer) 3