Redis 命令詳解:HyperLogLog
HyperLogLog是Redis的高階資料結構,它在做基數統計的時候非常有用,每個HyperLogLog的鍵可以計算接近264 不同元素的基數,而大小隻需要12KB。
HyperLogLog目前只支援3個命令,PFADD、PFCOUNT、PFMERGE。我們先來逐一介紹一下。
PFADD
最早可用版本:2.8.9
時間複雜度:O(1)
將引數中的元素都加入指定的HyperLogLog資料結構中,這個命令會影響基數的計算。如果執行命令之後,基數估計改變了,就返回1;否則返回0。如果指定的key不存在,那麼就建立一個空的HyperLogLog資料結構。該命令也支援不指定元素而只指定鍵值,如果不存在,則會建立一個新的HyperLogLog資料結構,並且返回1;否則返回0。
PFCOUNT
最早可用版本:2.8.9
時間複雜度:O(1),對於多個比較大的key的時間複雜度是O(N)
對於單個key,該命令返回的是指定key的近似基數,如果變數不存在,則返回0。
對於多個key,返回的是多個HyperLogLog並集的近似基數,它是通過將多個HyperLogLog合併為一個臨時的HyperLogLog,然後計算出來的。
HyperLogLog可以用很少的記憶體來儲存集合的唯一元素。(每個HyperLogLog只有12K加上key本身的幾個位元組)
HyperLogLog的結果並不精準,錯誤率大概在0.81%。
需要注意的是:該命令會改變HyperLogLog,因此使用8個位元組來儲存上一次計算的基數。所以,從技術角度來講,PFCOUNT是一個寫命令。
效能問題
即使理論上處理一個儲存密度大的HyperLogLog需要花費較長時間,但是當指定一個key時,PFCOUNT命令仍然具有很高的效能。這是因為PFCOUNT會快取上一次結算的基數,而多數PFADD命令不會更新暫存器。所以才可以達到每秒上百次請求的效果。
當處理多個key時,最耗時的一步是合併操作。而通過計算出來的並集的基數是不能快取的。所以多個key的處理速度一般在毫秒級。
PFMERGE
最早可用版本:2.8.9
時間複雜度:O(N),N是要合併的HyperLogLog的數量
用法:PFMERGE destkey sourcekey [sourcekey …]
合併多個HyperLogLog,合併後的基數近似於合併前的基數的並集(observed Sets)。計算完之後,將結果儲存到指定的key。
除了這三個命令,我們還可以像操作String型別的資料那樣,對HyperLogLog資料使用SET和GET命令。關於HyperLogLog的原理以及其他細節,我將在明天的文章中進行介紹,敬請期待。