Redis 學習筆記(十一)基數統計(HyperLogLog)
1. 介紹
HyperLogLog命令是redis在2.8版本中加入的,Redis中HyperLogLog是用來做基數統計的。
HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、並且是很小的,因此每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近
2.HyperLogLog命令
- PFADD
- 將指定的元素添加到指定的HyperLogLog 結構中。
- 如果一個HyperLogLog的估計的近似基數在執行命令過程中發了變化, PFADD 返回1,否則返回0。
PFADD key element [element ...]
127.0.0.1:6379> PFADD count user1 user2 user3 //往count中添加三個元素
(integer) 1 //添加成功
127.0.0.1:6379> PFCOUNT count //返回count這個鍵的估計值
(integer) 3
127.0.0.1:6379> PFADD count user1 user2 user3
(integer) 0 //添加失敗,因爲所有元素都已存在
127.0.0.1:6379> PFCOUNT count
(integer) 3 //還是3個
127.0.0.1:6379> PFADD count user3 user4 //添加成功,但是隻添加不存在的user4元素
(integer) 1
127.0.0.1:6379> PFCOUNT count //估計值變成4個
(integer) 4
- PFCOUNT
- 參數爲一個key時,返回存儲在HyperLogLog結構體的該變量的近似基數,如果該變量不存在,則返回0。
- 當參數爲多個key時,返回這些HyperLogLog**並集**的近似基數,這個值是將所有給定key的HyperLoglog結構合併到一個臨時的HyperLogLog結構中計算而得到的。
- 返回的可見集合基數並不是精確值, 而是一個帶有 0.81% 標準錯誤(standard error)的近似值。
PFCOUNT key [key ...]
127.0.0.1:6379> PFADD count1 a b c d //往count1添加4個元素
(integer) 1
127.0.0.1:6379> PFCOUNT count1 //返回估計值爲4
(integer) 4
127.0.0.1:6379> PFADD count2 a c e f //往count2添加4個元素
(integer) 1
127.0.0.1:6379> PFCOUNT count2 //返回估計值爲4
(integer) 4
127.0.0.1:6379> PFCOUNT count1 count2 //返回count1和count2並集的估計值6
(integer) 6
- PFMERGE
- 將多個 HyperLogLog 合併(merge)爲一個 HyperLogLog , 合併後的 HyperLogLog 的基數接近於所有輸入 HyperLogLog 的可見集合(observed set)的並集。
- 合併得出的 HyperLogLog 會被儲存在目標變量(第一個參數)裏面, 如果該鍵並不存在, 那麼命令在執行之前, 會先爲該鍵創建一個空的。
PFMERGE destkey sourcekey [sourcekey ...]
127.0.0.1:6379> PFMERGE count3 count1 count2 //將count1和count2合併到count3中
OK
127.0.0.1:6379> PFCOUNT count3 //返回count3的估計值6
(integer) 6
3.基數統計的比較
有序集合、集合、HyperLogLog和位圖(bitmap)四種統計元素基數的比較: