3

Redis は最近、HyperLogLog と呼ばれる新しいデータ構造をリリースしました。これにより、一意のオブジェクトの数を保持でき、12k バイトのサイズしか占有しません。私が理解していないのは、Redis の PFCOUNT コマンドが技術的には書き込みコマンドと言われていることです。これはなぜですか?

注: この関数を呼び出すことの副作用として、HyperLogLog が変更される可能性があります。これは、最後の 8 バイトがキャッシュ目的で最新の計算されたカーディナリティをエンコードするためです。したがって、PFCOUNT は技術的には書き込みコマンドです。

4

1 に答える 1

4

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 オブジェクトを変更できます。

于 2014-04-22T18:05:27.223 に答える