?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
PFCOUNT key [key ...]
自2.8.9起可用。
時間復(fù)雜度: O(1)用單個密鑰調(diào)用時的平均時間非常短。O(N),其中N是密鑰的數(shù)量,當(dāng)用多個密鑰調(diào)用時,恒定時間大得多。
使用單個鍵調(diào)用時,返回由存儲在指定變量中的 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)計算的近似基數(shù),如果該變量不存在,則返回0。
使用多個鍵調(diào)用時,通過將存儲在所提供的鍵中的 HyperLogLog 內(nèi)部合并到臨時 HyperLogLog 中,返回傳遞的 HyperlogLog 的聯(lián)合的近似基數(shù)。
可以使用 HyperLogLog 數(shù)據(jù)結(jié)構(gòu),以便使用少量恒定內(nèi)存(特別是每個 HyperLogLog 的12k字節(jié)(加上密鑰本身的幾個字節(jié)))對集合中的唯一元素進行計數(shù)。
觀察到的集合的返回基數(shù)不是確切的,但是以0.81%的標準誤差近似。
例如,為了計算一天中執(zhí)行的所有唯一搜索查詢的計數(shù),程序需要在每次處理查詢時調(diào)用 PFADD??梢噪S時使用 PFCOUNT 檢索唯一查詢的估計數(shù)量。
注意:由于調(diào)用此函數(shù)的副作用,HyperLogLog 可能會被修改,因為最后8個字節(jié)會將最新計算的基數(shù)編碼為高速緩存目的。所以 PFCOUNT 在技術(shù)上是一個寫命令。
整數(shù)回復(fù),具體為:
通過PFADD觀察到的獨特元素的近似數(shù)量。
redis> PFADD hll foo bar zap (integer) 1
redis> PFADD hll zap zap zap (integer) 0
redis> PFADD hll foo bar (integer) 0
redis> PFCOUNT hll (integer) 3
redis> PFADD some-other-hll 1 2 3 (integer) 1
redis> PFCOUNT hll some-other-hll (integer) 6
當(dāng)使用單個鍵調(diào)用 PFCOUNT 時,即使理論上處理密集型 HyperLogLog 的時間很長,性能也非常好。這是可能的,因為 PFCOUNT 使用緩存來記住之前計算的基數(shù),這很少發(fā)生變化,因為大多數(shù) PFADD 操作不會更新任何寄存器。每秒可執(zhí)行數(shù)百次操作。
當(dāng)使用多個密鑰調(diào)用 PFCOUNT 時,將執(zhí)行 HyperLogLog 的即時合并,這很慢,而且聯(lián)合的基數(shù)不能被緩存,所以當(dāng)與多個密鑰 PFCOUNT 一起使用時,可能需要一段時間毫秒數(shù)量級,并且不應(yīng)該被濫用。
用戶應(yīng)該記住,該命令的單鍵和多鍵執(zhí)行在語義上是不同的并且具有不同的性能。
Redis HyperLogLog 使用雙重表示法表示:適用于 HLL 計數(shù)少量元素(導(dǎo)致少量寄存器設(shè)置為非零值)的稀疏表示形式,以及適用于更高基數(shù)的密集表示形式。需要時,Redis 會自動從稀疏狀態(tài)切換到密集狀態(tài)。
稀疏表示使用經(jīng)過優(yōu)化的游程編碼來有效地存儲大量設(shè)置為零的寄存器。密集表示是一個12288字節(jié)的 Redis 字符串,用于存儲16384個6位計數(shù)器。對雙重表示的需求來自于使用12k(這是密集表示內(nèi)存要求)對少量寄存器進行編碼以獲得更小的基數(shù)的事實,這是非常不理想的。
兩種表示都以16字節(jié)的頭部作為前綴,其中包含魔術(shù),編碼/版本字段以及計算出的緩存基數(shù)估計值,并以 little endian 格式存儲(如果自 HyperLogLog 更新后估計無效,則最高有效位為1因為計算基數(shù))。
作為 Redis 字符串的 HyperLogLog 可以使用GET進行檢索并使用 SET 進行恢復(fù)。使用損壞的 HyperLogLog 調(diào)用 PFADD,PFCOUNT 或 PFMERGE 命令絕不是問題,它可能會返回隨機值,但不會影響服務(wù)器的穩(wěn)定性。大多數(shù)情況下,當(dāng)破壞稀疏表示時,服務(wù)器會識別損壞并返回錯誤。
從處理器字長和字節(jié)序的觀點來看,該表示是中性的,因此32位和64位處理器使用相同的表示法,即大字節(jié)或小字節(jié)。