Redisでセットを管理する方法
以下、日本語で自然に言い換えたものを一つ提示します:「序論」
Redisはオープンソースのインメモリキーバリューデータストアです。Redisのセットは、特定のキーで保存される文字列のコレクションです。セット内の個々のレコードの値はメンバーと呼ばれます。リストとは異なり、セットは順序を持たず、重複した値は許容されません。
このチュートリアルでは、セットの作成方法、メンバーの取得と削除方法、さらには異なるセットのメンバーの比較方法について説明します。
このガイドの使い方
このガイドは、具体的な例を含めたチートシートとして書かれています。タスクの完了に関連するセクションに適宜飛ぶことをお勧めします。
このガイドで示されたコマンドは、Redisバージョン6.0.16を実行しているUbuntu 22.04サーバーでテストされました。同様の環境をセットアップするには、「Ubuntu 22.04にRedisをインストールしてセキュリティを確保する方法」ガイドのステップ1に従うことができます。これらのコマンドがどのように動作するかを示すために、Redisコマンドラインインターフェースであるredis-cliを使用して実行します。例えば、Redliなど異なるRedisインターフェースを使用している場合、一部のコマンドの出力が異なる場合があります。
次に挙げる方法もあります。これは、これらのコマンドをテストするために、管理されたRedisデータベースインスタンスを用意することです。ただし、データベースプロバイダーが許可する制御レベルによっては、このガイドで説明されている通りに一部のコマンドが動作しない場合がありますので、注意してください。Silicon Cloudマネージドデータベースを提供するには、マネージドデータベース製品のドキュメントに従ってください。次に、Redliをインストールするか、TLSトンネルを設定してTLS経由でマネージドデータベースに接続しなければなりません。
セットを作成する
saddコマンドを使用すると、セットを作成してそのメンバーを1つ以上追加することができます。次の例では、”Frankenstein”と”Godzilla”というメンバーを持つ、キー名がkey_horrorのセットが作成されます。
- sadd key_horror “Frankenstein” “Godzilla”
成功すれば、sadはセットに追加されたメンバーの数を示す整数を返します。
(integer) 2
もし既に非セットの値が入っているキーにセットのメンバーを追加しようとすると、エラーが返されます。このブロックの最初のコマンドでは、要素が一つのリスト”key_action”が作成され、要素は”シャフト”です。
- rpush key_action “Shaft”
次のコマンドは、リストにセットのメンバーである「Shane」を追加しようとしますが、データ型の衝突によりエラーが発生します。
- sadd key_action “Shane”
(error) WRONGTYPE Operation against a key holding the wrong kind of value
同じメンバーの複数の出現を許可しないことに注意してください。
- sadd key_comedy “It’s” “A” “Mad” “Mad” “Mad” “Mad” “Mad” “World”
(integer) 4
このsaddコマンドでは、8人のメンバーを指定しているにもかかわらず、重複した「Mad」メンバー4人を削除して、セットのサイズは4人になります。
セットからメンバーを取得する
このセクションでは、セットに保持されているメンバーに関する情報を返すいくつかのRedisコマンドを確認します。以下のコマンドを実行して、指示されたコマンドを練習します。このコマンドは、key_stoogesというキーに6つのメンバーを持つセットを作成します。
- sadd key_stooges “Moe” “Larry” “Curly” “Shemp” “Joe” “Curly Joe”
セットのすべてのメンバーを返すには、smembersコマンドを実行して調査したいキーを続けて入力してください。
- smembers key_stooges
1) “Curly” 2) “Moe” 3) “Larry” 4) “Shemp” 5) “Curly Joe” 6) “Joe”
特定の値がセットのメンバーであるかどうかを確認するには、sismemberコマンドを使用します。
- sismember key_stooges “Harpo”
もし要素「ハーポ」がキー_ストーグスのメンバーである場合、sismemberは1を返します。そうでなければ、0を返します。
(integer) 0
与えられた集合のメンバーの数を確認するために(つまり、与えられた集合の濃度を求めるために)、scardを実行します。
- scard key_stooges
(integer) 6
setからランダムな要素を返すには、srandmemberを実行します。
- srandmember key_stooges
“Larry”
セットから複数のランダムで異なる要素を返すには、srandmemberコマンドの後に取得したい要素の数を指定できます。
- srandmember key_stooges 3
1) “Larry” 2) “Moe” 3) “Curly Joe”
srandmemberに負の数を渡すと、同じ要素を複数回返すことが許されます。
- srandmember key_stooges -3
1) “Shemp” 2) “Curly Joe” 3) “Curly Joe”
srandmemberで使用されるランダム要素関数は完全にランダムではありませんが、データセットが大きいほどパフォーマンスが向上します。詳細については、コマンドの公式ドキュメントをお読みください。
セットからメンバーを取り除く。
Redisには、セットからメンバーを削除するために使用される3つのコマンドがあります:spop、srem、およびsmove。
spopは、指定された数のメンバーをセットからランダムに選択して返し、srandmemberに似た動作をしますが、その後セットから削除します。引数としてセットを含んだキーの名前と、セットから削除するメンバーの数を指定することができます。数を指定しない場合、spopはデフォルトで単一の値を返して削除します。
前のセクションで作成されたkey_stoogesセットから、ランダムに2つの要素を削除して返します。
- spop key_stooges 2
1) “Shemp” 2) “Larry”
sremは、ランダムではなく、特定のメンバーを一つまたは複数個、集合から除去することができます。
- srem key_stooges “Joe” “Curly Joe”
削除されたメンバーを返す代わりに、sremは削除されたメンバーの数を表す整数値を返します。
(integer) 2
smoveコマンドを使用して、メンバーを1つのセットから別のセットに移動します。このコマンドでは、引数としてソースセット、宛先セット、そして移動するメンバーを順番に指定します。なお、smoveコマンドでは1度に1つのメンバーしか移動することができません。
- smove key_stooges key_jambands “Moe”
もしコマンドがメンバーを成功裏に動かすなら、(整数)1が返されます。
(integer) 1
スムーブが失敗した場合、代わりに(整数) 0 を返します。なお、宛先のキーが既に存在しない場合、スムーブはメンバーを移動する前にキーを作成します。
セットを比較する
Redisは、セット間の違いや類似性を見つけるためのさまざまなコマンドも提供しています。これらがどのように動作するかを示すために、このセクションではpresidents、kings、そしてbeatlesという3つのセットを参照します。このセクションのコマンドを自分自身で試してみたい場合は、次のsaddコマンドを使用してこれらのセットを作成し、データを追加してください。
- sadd presidents “George” “John” “Thomas” “James”
- sadd kings “Edward” “Henry” “John” “James” “George”
- sadd beatles “John” “George” “Paul” “Ringo”
シンターは異なるセットを比較し、セットの共通部分やすべてのセットに現れる値を返します。
- sinter presidents kings beatles
1) “John” 2) “George”
sinterstoreは同じ機能を実行しますが、交差するメンバーを返す代わりに、指定した宛先にこれらの交差するメンバーを含む新しいセットを作成します。なお、宛先が既に存在している場合、sinterstoreは内容を上書きします。
- sinterstore new_set presidents kings beatles
- smembers new_set
1) “John” 2) “George”
sdiffは、最初の指定された集合から次の各集合の差分によって生じるメンバーの集合差を返します。
- sdiff presidents kings beatles
1) “Thomas”
sdiffは最初に与えられたセットの各メンバーを評価し、それらを次のセットのメンバーと比較します。最初のセットに含まれる任意のメンバーが、後続のセットにも含まれている場合、そのメンバーは削除され、sdiffは残りのメンバーを返します。最初のセットから後続のセットのメンバーを取り除くと考えてください。
sdiffstoreは、sdiffと類似の機能を持っていますが、集合の差分を返す代わりに、指定された宛先に新しい集合を作成して、その集合の差分を格納します。
- sdiffstore new_set beatles kings presidents
- smembers new_set
1) “Paul” 2) “Ringo”
シンターストアと同様に、すでに存在する場合にはsdiffstoreも宛先キーを上書きします。
sunionは、指定した全てのセットのメンバーを含む集合の和集合を返します。
- sunion presidents kings beatles
1) “Thomas” 2) “George” 3) “Paul” 4) “Henry” 5) “James” 6) “Edward” 7) “John” 8) “Ringo”
sunionは結果を新しい集合のように扱い、任意のメンバーの重複を許さないようにしています。
sunionstoreは同様の機能を提供しますが、結果を返す代わりに指定した場所に新しいセットの和集合を作成します。
- sunionstore new_set presidents kings beatles
(integer) 8
sinterstoreやsdiffstoreと同様に、既に存在する場合はdestinationキーを上書きするsunutonstoreです。
結論
このガイドでは、Redisでセットを作成および管理するために使用されるいくつかのコマンドについて詳しく説明しています。もし関連する他のコマンドや引数、手順について学びたい場合は、コメントで質問したり、提案をしてください。
Redisコマンドの詳細については、Redisデータベースの管理方法に関する当社のチュートリアルシリーズをご覧ください。