Redis 學習筆記(十一)基數統計(HyperLogLog)

Redis 學習筆記(十一)基數統計(HyperLogLog)

1. 介紹

HyperLogLog命令是redis在2.8版本中加入的,Redis中HyperLogLog是用來做基數統計的。

HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、並且是很小的,因此每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 264 個不同元素的基數。但是HyperLogLog也存在缺點,就是它是估計基數的算法,所以會有一定誤差0.81%,而且無法獲取具體的元素值。因此應用在對準確性不是很重要的場景,例如:QQ同時在線人數,網站IP訪問數量等等。

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)四種統計元素基數的比較:

redis統計基數四種辦法的比較

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章