2017-10-11 10 views
-1

私はrenameコマンドを実行すると、私は(これがあれば、いくつかの時間がかかることもこのようなもの、データは常にRedisのRenameで利用可能ですか?

  1. 古い名前のために使用して、新しいデータのための新しい名前
  2. 削除参照
  3. は、古いデータを削除しないと思います大規模です)

このデータにアクセスするクライアントの場合、これらのいずれかが発生することはありますか?

  1. キーは、データがRedisの名前を変更するコマンドの間に実行されているどのような手順

アクセス中に

  • のRedisがハングアップし良好な状態ではありません
  • 存在しないのですか?

  • 答えて

    1

    Redisにはコマンドのシングルスレッド実行があるため、名前の変更はアトミックなので、1と2に対する答えはnoです。 「古いデータを削除する」ことは、削除先のキーが既に大きな構造を指している場合のみです(Redisはそれを壊します)。元のデータオブジェクトはコピーされません。これを指しているハッシュテーブルエントリだけが移動される可能性があります。 Redisの再ハッシングはインクリメンタルなので、これは本質的に一定の時間です。

    Redisは、単一スレッドのコマンド実行のために、低速コマンドでは常に「ハング」します。だから、3の場合は、あなたがやっていることに応じて常にyesにすることができますが、この場合、暗黙的に大幅に大きな削除を行っている場合のみです。

    編集:Redis 4.0の時点で、実際にconfigオプションlazyfree-lazy-server-del yes(デフォルトはno)を指定することができ、サーバーは実際にこのような副作用の削除を非同期的に削除します。つまり、ブロックを削除する代わりに、オブジェクトはバックグラウンド削除のためにキューに入れられます。これは効果的にRENAMEを一定時間にします。サンプルcfg:https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf

    関連する問題