當參數為一個key時,傳回存儲在HyperLogLog結構體的該變量的近似基數,如果該變量不存在,則傳回0.
當參數為多個key時,傳回這些HyperLogLog并集的近似基數,這個值是将所給定的所有key的HyperLoglog結構合并到一個臨時的HyperLogLog結構中計算而得到的.
HyperLogLog可以使用固定且很少的記憶體(每個HyperLogLog結構需要12K位元組再加上key本身的幾個位元組)來存儲集合的唯一進制素.
傳回的可見集合基數并不是精确值, 而是一個帶有 0.81% 标準錯誤(standard error)的近似值.
例如為了記錄一天會執行多少次各不相同的搜尋查詢, 一個程式可以在每次執行搜尋查詢時調用一次PFADD, 并通過調用PFCOUNT指令來擷取這個記錄的近似結果.
注意: 這個指令的一個副作用是可能會導緻HyperLogLog内部被更改,出于緩存的目的,它會用8位元組的來記錄最近一次計算得到基數,是以PFCOUNT指令在技術上是個寫指令.
##傳回值
integer-reply:
PFADD添加的唯一進制素的近似數量.
##例子
##性能
當調用PFCOUNT指令時指定一個key為參數,性能表現很好,甚至和處理一個HyperLogLog所需要的時間一樣短.這可能和PFCOUNT指令能夠直接使用緩存的的估計基數有關,大多數的PFADD也不會更新任何寄存器,是以這個值也很少被更改.理論上能達到每秒幾百次操作.
當調用PFCOUNT指令時指定多個key,由于要在多個HperLogLog結構中執行一比較慢合并操作,而且這個通過并集計算得到的基數是不能夠被緩存, PFCOUNT指令還要消耗毫秒量級的時間來進行多個key的并集操作,消耗的時間會比較長一些,是以不要濫用這種多個key的方式.
使用者需要明白這個指令來處理1個key和多個key執行的語義是不同的,并且執行的性能也不相同.
更多的資訊請參考這篇文章. 源代碼 hyperloglog.c檔案也很簡單易了解, 包含了稀松與密集兩種實作的編碼.
本文作者:陳群
本文來自雲栖社群合作夥伴rediscn,了解相關資訊可以關注redis.cn網站。