HyperLogLog オブジェクトのヘッダーは次のとおりです。
struct hllhdr {
char magic[4]; /* "HYLL" */
uint8_t encoding; /* HLL_DENSE or HLL_SPARSE. */
uint8_t notused[3]; /* Reserved for future use, must be zero. */
uint8_t card[8]; /* Cached cardinality, little endian. */
uint8_t registers[]; /* Data bytes. */
};
カード フィールドに注意してください。これには、アルゴリズムによって評価された最後のカーディナリティが含まれています。カーディナリティの推定値を計算するのはコストのかかる操作であるため、Redis は値をキャッシュして、このフィールドに保持します。
PFADD が呼び出されると、HyperLogLog オブジェクトが更新される場合と更新されない場合があります (更新されない可能性は十分にあります)。更新されていない場合、PFCOUNT を呼び出すと、キャッシュされた値 (カード フィールド) が再利用されます。更新された場合、カード フィールドは無効になるため、次の PFCOUNT はカウント アルゴリズムを実行し、新しい値をカード フィールドに書き込みます。
そのため、PFCOUNT は HyperLogLog オブジェクトを変更できます。