私はrenameコマンドを実行すると、私は(これがあれば、いくつかの時間がかかることもこのようなもの、データは常にRedisのRenameで利用可能ですか?
- 古い名前のために使用して、新しいデータのための新しい名前
- 削除参照
- は、古いデータを削除しないと思います大規模です)
このデータにアクセスするクライアントの場合、これらのいずれかが発生することはありますか?
- キーは、データがRedisの名前を変更するコマンドの間に実行されているどのような手順
アクセス中に
私はrenameコマンドを実行すると、私は(これがあれば、いくつかの時間がかかることもこのようなもの、データは常にRedisのRenameで利用可能ですか?
このデータにアクセスするクライアントの場合、これらのいずれかが発生することはありますか?
アクセス中に
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