4系から追加されたUNLINKについてredisはじめに2017年7月にリリースされたredis4.0から、特定のキーの値を非同期的に削除するUNLINKコマンドがでました。UNLINKコマンドの既存のDELコマンドとの違いついてまとめます。redis4.0系リリース2017年7月にredis4.0系がリリースされました。主な機能に関しては、下記のqiitaの記事にまとめられています。qiita.comredis4.0.0のリリースノートは下記のリンクで見ることができます。UNLINKに関する記述を抜粋します。複数のクライアントからクエリを実行された時、1つのキューに並んで順番に処理されます。そのため、データサイズの大きいデータセットに対してDELを実行すると、計算量が大きいため、後続の処理が遅れて大きなパフォーマンス低下の要因となってしまいます。今回4.0系で登場したUNLINKは、ある値を削除する際にこの問題を解決するコマンドです。UNLINKを使ったクエリが実行された際、文字通り、指定されたキーの値を即座に削除せず、非同期的にデータセット内のキーを格納したキースペースからUNLINKされ、実際のデータは後に削除されます。これにより、ノンブロッキングな処理が可能となります。O(1)で処理が完了します。文の時間の計算量O(N)となります。UNLINKの内部処理を見るUNLINKコマンドの内部処理が気になったので、githubに上がっているredisのソースを読んでみました。src/lazyfree.cあたりにまとまっています。UNLINKが実行されたときに、dbAsyncDeleteと呼ばれる関数が呼ばれます。文字通り、データを非同期的に削除する処理を行っています。dictGenericDeleteと呼ばれるstatic関数を呼び出しています。これは、データセット内の特定のキーへのリンクを解除しています。dictGenericDelete内では、対象のキーへの参照を外すことで、UNLINKを行っているようです。上記のコードをのwhileループ内の処理を抜粋してみると、おぼろげながらも理解ができるかと思います。0の場合は直接データを消す、つまりメモリをfreeしているようです。{実際には下記の用な感じで呼び出されています。dictGenericDelete(ht,key,1);}という感じになります。このあたりの実装は読んでいて非常に勉強になるので、redisを使っている方は読んでみることをおすすめします。まとめredis4.0系から、データセット内の特定のキーを非同期で削除できるUNLINKコマンドが追加されました。UNLINKしています。これにより、シングルスレッドモデルを採用しているredisで、データ容量が大きい場合にDELによって実行速度が遅くなってしまう問題を解消できます。UNLINKを使うことによって大きくパフォーマンス改善が図れるかと思います。http/2の実装がマージされました。優れた技術専門職になるためのガイド」の内容レビューに関わらせていただきました。4はてなブログをはじめよう!kaktsさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。