Table Of Contents

Previous topic

リスト型

Next topic

ソート済みセット型

This Page

セット型

Redisセット型はRedis文字列型の順不同の集合です。Redisセット型ではメンバの追加、削除、確認をすべてO(1)で行うことができます。

Redisセットはメンバの重複を許可しないという価値のある性質を持っています。同じ要素を何度も追加しても結果としてセット内にはその要素は単一のコピーしか持ち合わせません。事実上、このことはメンバを追加する際に「そのメンバが存在するか確認した後に追加する」という操作を必要としない、ということを意味します。

セットを操作するコマンドはアプリケーションにメンバが存在したことを警告するのに便利な値を返すようになっています。たとえば SADD コマンドはもし要素がまだセットのメンバでなかったら 1 を返し、そうでなかったら 0 を返すようになっています。

セットの要素数の最大値は 2^32-1(4294967295, 1セットあたり4億以上のメンバ)です。

Redisセットは幅広い操作をサポートしています。たとえば結合、共通部分、差異の取得などです。共通部分の取得は参照回数が最小限になるように最適化されています。たとえば10000要素あるセットと2要素のセットの共通部分を取得しようとした場合、Redisは2要素を持つセットをイタレートしてもう一方のセットにそれぞれの要素が存在するかの確認をします。10000要素の参照ではなく2要素のみの参照で済むわけです。

実装の詳細

Redisセットはハッシュ表を使って実装されていまので、メンバの追加、削除、確認といった操作は平均でO(1)となります。ハッシュ表は新しい要素が追加または削除されたときに自動的にリサイズします。

ハッシュ表のリサイズは同期的に行われるブロッキング操作です。ですので、(数百万要素を持っているような)巨大なセットを扱う場合は、他のクライアントがRedisに対して高速にクエリを投げているときに大量の要素を挿入するようなことはしないように気をつけるべきです。

このような問題を回避するために、近いうちにスキップリストによる実装に変更する予定です。(ソート済みセットではすでにそうなっています)

セット型のコマンド

SADD(key, member)

計算時間: O(1)

指定されたメンバ member

返り値

Integer reply, specifically:

1 if the new element was added 0 if the element was already a member of the set
SREM(key, member)

計算時間 O(1)

指定したメンバー member をキー key に対応するセットから取り除きます。もし member がセットのメンバ出なかった場合は何も実行されません。もし key に対応する値がセット型でなかった場合はエラーが返ります。

帰り値

SPOP(key)

計算時間 O(1)

キー key に対応するセットからランダムで1要素を選んで削除し、それを返り値として返します。もしセットが空だった、あるいは key が存在しなかった場合はnilオブジェクトが返ります。

SRANDMEMBER コマンドは似た動作をしますが、返される要素はセットから取り除かれません。

返り値

Bulk replyが返ります。
SMOVE(srckey, dstkey, member¶)

計算時間 O(1)

指定されたメンバー member をキー srckey に対応するセットから dstkey に対応するセットに移します。この操作はアトミックで、アクセスしているクライアントからはどんな要素も移動元か異動先のセット内に確認できます。

もし移動元のセットが存在しない、あるいは指定した要素を含んでいなかった場合は何も操作は行われず、ゼロが返ります。そうでない場合は要素は移動元のセットから削除され、異動先のセットに追加されます。成功した場合は、移動した要素が返り値として返されます。これは異動先にその要素がすでにあった場合でも同様です。

もし異動元あるいは異動先に対応するキーがセット型でない値を保持していたらエラーが返ります。

返り値

Integer replyが返ります。具体的には下記:

1 if the element was moved
0 if the element was not found on the first set and no operation was performed
SCARD(key)

計算時間 O(1)

セットの濃度(要素の数)を返します。もしキーが存在しない場合は空のセットと同様に0が返ります。

返り値

Integer replyが返ります。具体的には:

the cardinality (number of elements) of the set as an integer.
SISMEMBER(key, member)

計算時間 O(1)

もしメンバー member がキー key に対応するセットに含まれていたら1が返り、無かった場合は0が返ります。

返り値

Integer replyが返ります。具体的には下記:

1 if the element is a member of the set
0 if the element is not a member of the set OR if the key does not exist
SINTER(key1, key2, ..., keyN)

計算時間 O(N*M) 最悪の場合のN*MではNは最小のセットの濃度でMはセット数です。

指定された各キー keyN すべての共通の要素からなるセットのメンバーを返します。 LRANGE のように結果はmulti bulk replyの形でクライアントに返されます。(より深い情報は仕様を参照のこと)キーが一つだけ指定された場合は SMEMBERS と同じ結果が返ります。実際には SMEMBERSINTERSECT の糖衣構文に過ぎません。

存在しないキーに関しては空のセットと同様に扱われます。したがって、もし指定したキーのうち1つが存在しなかった場合は空のセットが返ります。(空のセットとの共通部分は常に空です)

返り値

Multi bulk replyが返ります。具体的には共通の要素のリストです。
SINTERSTORE(dstkey, key1, key2, ..., keyN)

計算時間 O(N*M) 最悪の場合のN*MではNは最小のセットの濃度でMはセット数です。

このコマンドは SINTER とまさに同様に動作しますが、結果のセットを返す代わりにキー dstkey に結果を保存します。

返り値

Status code replyが返ります。
SUNION(key1, key2, ..., keyN)

計算時間 O(N): Nは指定されたキーに対応するセット中の要素数の合計

指定したキー keyN に対応するすべてのセットの結合からなるセット内の要素を返します。 LRANGE のようにクライアントに返される結果はmulti-bulk replyになります。(詳細は仕様を参照のこと)キーが1つだけ指定された場合は SMEMBERS と同じ結果となります。

存在しないキーの場合は空のセットが返ります。

返り値

Multi bulk replyが返ります。具体的には結合後のセット内の要素のリストです。

Note

原文では「共通の要素」(common elements)となっているが間違いだと思われる。

SUNIONSTORE(dstkey, key1, key2, ..., keyN)

計算時間 O(N): Nは指定されたキーに対応するセット中の要素数の合計

このコマンドは SUNION とほぼ同じような動作をしますが、結果のセットが返されるのではなく、 dstkey で指定されたセットに保存されます。 dstkey に対応するセットは上書きされます。

返り値

Status code replyが返ります。
SDIFF(key1, key2, ..., keyN)

計算時間 O(N): Nは指定されたキーに対応するセット中の要素数の合計

最初のキー key1 に対応するセットとそれ以降のキー keyN に対応するセットの差分からなるセットの要素を返します。例えば:

key1 = x,a,b,c
key2 = c
key3 = a,d
SDIFF key1,key2,key3 => x,b

存在しないキーは空のセットとして扱われます。

返り値

Multi bulk replyが返ります。具体的には差分のセットの要素からなるリストです。

Note

原文では「共通の要素」(common elements)となっているが間違いだと思われる。

SDIFFSTORE(dstkey, key1, key2, ..., keyN)

計算時間 O(N): Nは指定されたキーに対応するセット中の要素数の合計

このコマンドは SDIFF とほぼ同様に動作しますが、結果のセットを返す代わりに dstkey に対応するセットに保存します。

返り値

Status code replyを返します。
SMEMBERS(key)

計算時間 O(N)

キー key に対応するセット内のすべてのメンバ(要素)を返します。これは SINTER の糖衣構文にすぎません。

返り値

Multi bulk replyが返ります。
SRANDMEMBER(key)

計算時間: O(1)

キー key に対応するセットからランダムに1つの要素を返します。もし指定されたセットが空、またはキーが存在しなかった場合はnilオブジェクトが返ります。

SPOP コマンドは似た動作をしますが、 SPOP の場合は要素がセットからポップされ(削除され)ます。

返り値

Bulk replyが返ります。