2012-02-09 26 views
1

精度で

私は、dbsizeによって返されたキーの数がkeysコマンドによって返された実際のキーの数と一致しないことに気付きました。ここで

は例です:

redis-cli dbsize 
(integer) 3057 
redis-cli keys "*" | wc -l 
2072 

はなぜキーの実際の数よりdbsizeそんなに高いのですか?

+1

キーを期限切れにしていますか? 1つの違いは、dbsizeは期限切れのキーを除外せずにメインディクショナリのキー数を返すだけですが、keysコマンドは返される前に特定のキーが期限切れであるかどうかを体系的にチェックします。 –

+0

はい、私は私の鍵を失効させます。それでそれを説明します。これを回答として提出すれば、私はそれを受け入れます。ありがとう! –

答えて

2

私はそれがキーの有効期限にリンクされていると言うでしょう。 Redisのかmemcachedのような

キー/値ストアが期限切れにオブジェクトごとに物理的なタイマーを定義する余裕はありません。あまりにも多くの人がいるでしょう。代わりに、データ構造を定義して、期限切れになるアイテムを容易に追跡し、すべての満了イベントを単一の物理タイマーに多重化します。また、これらのイベントに対処するための遅延戦略を実装する傾向があります。 Redisので

アイテムの有効期限が切れたとき、何も起こりません。ただし、各アイテムへのアクセスの前に、期限切れアイテムの返却を避けるためにチェックが体系的に行われ、潜在的にアイテムが削除されます。この遅延戦略の上に、100msごとに、スカベンジャーアルゴリズムがトリガされ、物理的に多数の項目が期限切れになる(すなわち、それらがメイン辞書から削除される)。各反復で考慮される鍵の数は、有効期限の作業負荷に依存します(アルゴリズムは適応性があります)。

結果では、有効期限のイベントの着実な流れを持っているときのRedisは、任意の時点で期限が切れるようにアイテムのバックログを持っていることです。

質問に戻ると、DBSIZEコマンドはメイン辞書のサイズを返すだけなので、まだ削除されていない有効期限のある項目が含まれます。 KEYSコマンドは、ディクショナリ全体を処理し、個々のキーにアクセスするので、期限切れのアイテムはすべて除外されます。したがって、項目の数が一致しない可能性があります。