web-dev-qa-db-ja.com

UNLINKコマンドは常にDELコマンドよりも優れていますか?

Redis 4.0には、Redisメモリ内のキーを削除するための新しいコマンド [〜#〜] unlink [〜#〜] があります。

このコマンドはDELと非常によく似ており、指定されたキーを削除します。 DELと同様に、キーが存在しない場合は無視されます。ただし、コマンドは、別のスレッドで実際のメモリの再利用を実行するため、ブロックされませんが、DELは。これがコマンド名の由来です。コマンドはキースペースからキーのリンクを解除するだけです。実際の削除は後で非同期に行われます。

したがって、DELとは異なり、UNLINKは非ブロッキングであるため、常に(100%回) [〜#〜] del [〜#〜] の代わりにUNLINKを使用できます。

12
user3219492

どちらが優れているかを説明する前に、これらのコマンドの違いを見てみましょう。 DELUNLINKの両方が、ブロッキングモードでキー部分を解放します。そして違いは、彼らが価値のある部分を解放する方法です。

DELは、常にブロッキングモードで値の部分を解放します。ただし、値が大きすぎる場合、たとえば大きなLISTまたはHASHの割り当てが多すぎると、Redisが長時間ブロックされます。この問題を解決するために、RedisはUNLINKコマンドを実装します。つまり、「ノンブロッキング」削除です。

実際、UNLINK常に非ブロッキング/非同期であるとは限りませんです。値が小さい場合、例: LISTまたはHASHのサイズが64未満の場合、値はすぐに解放されます。このように、UNLINKDELとほぼ同じですが、DELよりも関数呼び出しのコストが少し高くなる点が異なります。ただし、値が大きい場合、Redisは値をリストに入れ、値は別のスレッドによって解放されます。つまり、非ブロッキング解放になります。このように、メインスレッドはバックグラウンドスレッドと同期する必要があり、これもコストがかかります。

結論として、値が小さい場合、DELは少なくともUNLINKと同じくらい良好です。値が非常に大きい場合、たとえばLIST数千または数百万のアイテムがある場合、UNLINKDELよりもはるかに優れています。 DELUNLINKにいつでも安全に置き換えることができます。ただし、スレッドの同期が問題になる場合(マルチスレッドは常に頭痛の種です)、DELにロールバックできます。

1
for_stack

はい。 antirezからLazy Redisの方が優れているRedisを読んでください。しかし、その理由は、リンク解除が非ブロッキングコマンドであるということではありません。理由は、リンク解除がデルよりも賢いからです。

UNLINKはスマートコマンドです。オブジェクトの割り当て解除コストを計算し、それが非常に小さい場合は、DELが実行するはずのことを実行し、オブジェクトをできるだけ早く解放します。それ以外の場合、オブジェクトは処理のためにバックグラウンドキューに送信されます。

また、より迅速な方法は、redisの決定を行うことだと思います。小さなキーにはDELを使用し、大きなリストやセットなどの大きなキーにはUNLINKを使用します。 redisの不必要な計算を減らすことができます。

3
GuangshengZuo