Redis 4.0には、Redisメモリ内のキーを削除するための新しいコマンド [〜#〜] unlink [〜#〜] があります。
このコマンドはDELと非常によく似ており、指定されたキーを削除します。 DELと同様に、キーが存在しない場合は無視されます。ただし、コマンドは、別のスレッドで実際のメモリの再利用を実行するため、ブロックされませんが、DELは。これがコマンド名の由来です。コマンドはキースペースからキーのリンクを解除するだけです。実際の削除は後で非同期に行われます。
したがって、DELとは異なり、UNLINKは非ブロッキングであるため、常に(100%回) [〜#〜] del [〜#〜] の代わりにUNLINKを使用できます。
どちらが優れているかを説明する前に、これらのコマンドの違いを見てみましょう。 DEL
とUNLINK
の両方が、ブロッキングモードでキー部分を解放します。そして違いは、彼らが価値のある部分を解放する方法です。
DEL
は、常にブロッキングモードで値の部分を解放します。ただし、値が大きすぎる場合、たとえば大きなLIST
またはHASH
の割り当てが多すぎると、Redisが長時間ブロックされます。この問題を解決するために、RedisはUNLINK
コマンドを実装します。つまり、「ノンブロッキング」削除です。
実際、UNLINK
は常に非ブロッキング/非同期であるとは限りませんです。値が小さい場合、例: LIST
またはHASH
のサイズが64
未満の場合、値はすぐに解放されます。このように、UNLINK
はDEL
とほぼ同じですが、DEL
よりも関数呼び出しのコストが少し高くなる点が異なります。ただし、値が大きい場合、Redisは値をリストに入れ、値は別のスレッドによって解放されます。つまり、非ブロッキング解放になります。このように、メインスレッドはバックグラウンドスレッドと同期する必要があり、これもコストがかかります。
結論として、値が小さい場合、DEL
は少なくともUNLINK
と同じくらい良好です。値が非常に大きい場合、たとえばLIST
数千または数百万のアイテムがある場合、UNLINK
はDEL
よりもはるかに優れています。 DEL
をUNLINK
にいつでも安全に置き換えることができます。ただし、スレッドの同期が問題になる場合(マルチスレッドは常に頭痛の種です)、DEL
にロールバックできます。
はい。 antirezからLazy Redisの方が優れているRedisを読んでください。しかし、その理由は、リンク解除が非ブロッキングコマンドであるということではありません。理由は、リンク解除がデルよりも賢いからです。
UNLINKはスマートコマンドです。オブジェクトの割り当て解除コストを計算し、それが非常に小さい場合は、DELが実行するはずのことを実行し、オブジェクトをできるだけ早く解放します。それ以外の場合、オブジェクトは処理のためにバックグラウンドキューに送信されます。
また、より迅速な方法は、redisの決定を行うことだと思います。小さなキーにはDELを使用し、大きなリストやセットなどの大きなキーにはUNLINKを使用します。 redisの不必要な計算を減らすことができます。