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