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需要花費較長時間,但是當指定乙個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的原理以及其他細節,我將在後面介紹,敬請期待。
redis命令詳解
1.使用客戶端連線redis服務,需要有乙個redis客戶端 redis cli h host p port a password 如果是本地的redis服務可以直接使用命令,預設本地 6379埠 redis cli 2.多個redis例項 多庫 設定資料庫個數 127.0.0.1 6379 con...
Redis命令詳解 Hashs
hash是一種string型別的field value的對映表,因此,它非常適合儲存物件。下面我們來一一介紹與hash相關的命令。hdel 最早可用版本 2.0.0 時間複雜度 o n 其中n為要刪除的field的個數 hdel命令用於刪除指定key的指定的乙個或多個field。如果指定的field...
Redis命令詳解 Hashs
hash是一種string型別的field value的對映表,因此,它非常適合儲存物件。下面我們來一一介紹與hash相關的命令。hdel 最早可用版本 2.0.0 時間複雜度 o n 其中n為要刪除的field的個數 hdel命令用於刪除指定key的指定的乙個或多個field。如果指定的field...