Table Of Contents

Previous topic

セット型

Next topic

ハッシュ型

This Page

ソート済みセット型

Redisソート済みセット型はRedisセット型とよく似ていて、Redis文字列型の集合となっています。違いはソート済みセットのすべてのメンバはスコアに関連したハッシュ値を持っています。元となっているスコアを用いてメンバを順番に並べます。

Redisソート済みセットに新しいメンバを追加するには要素のスコアを指定して ZADD コマンドを用います。すでにソート済みセット内に存在するメンバに対して異なるスコアを用いて ZADD を呼ぶと、順番が正しくなるようにその要素を正しい場所に移動させます。

Redisソート済みセットからある範囲の要素を取得することが可能です。これはRedisリストの LRANGE と同様に ZRANGE コマンドを用います。

またあるスコアの範囲で要素を取得または削除することも可能で、それには ZRANGEBYSCOREZREMRANGEBYSCORE コマンドを使います。

Redisソート済みセットの要素数の最大値は 2^32-1 (4294967295, 1つのセット辺り4億)です。

Redisソート済みセットはすでに順番に並んでいますが、異なる並び順を得るために SORT コマンドが使えるということを覚えておいてください。

実装の詳細

Redisセット型はスキップリストとハッシュ表の2つのデータ構造を用いて実装されています。要素が追加されたときには要素とスコアの間のマッピングがハッシュ表に追加されます。(これによって要素を用いてスコアを取得する操作がO(1)で行われます)そしてスコアと要素の間のマッピングはスキップリストに追加され順番に並べられます。

Redisは双方向リストを使っています。特別なスキップリストの実装をしています。理由は、逆順に捜査出来るようにするためです。( ZREVRANGE コマンドを確認してください)

要素のスコアを更新するために ZADD が使われた場合、Redisは要素のスコアをハッシュ表を用いて取得します。これによって位置を更新するために、スコアによってインデックス付けされたスキップリスト内の要素に高速アクセスすることが可能になっています。

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

近いうちにRedisではスキップリストが要素からスコアを指すマップを持つものに切り替わでしょう。すべてのソート済みセットが2つのスキップリストを持つことになります。1つは要素でインデックス付けされたもの、もう一方はスコアでインデックス付けされたものです。

ソート済みセット型のコマンド

ZADD(key, score, member)

New in version 1.1.

計算時間: O(log(N)) Nはソート済みセット内の要素数

スコア score を持つメンバー member をキー key に対応するセット内に追加します。もしメンバーがすでに指定されたソート済みセット内に存在する場合は、スコアが更新され正しい場所に再挿入されます。もしキーが存在しない場合は指定されたメンバだけを含む新しいソート済みセットが作られます。もしキーが存在して対応する値がソート済みセットでない場合はエラーが返ります。

スコアの値は倍精度浮動小数を表す文字列です。

ソート済みセットに関する紹介はこのページの先頭を参照してください。

返り値

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

1 if the new element was added
0 if the element was already a member of the sorted set and the score was updated
ZREM(key, member)

New in version 1.1.

計算時間: O(log(N)) with N being the number of elements in the sorted set

指定されたメンバー member をキー key に対応するソート済みセットから削除します。もしメンバーが指定されたセット内に存在しない場合は何の処理も行われません。もしキーがソート済みセットを保持していない場合、エラーが返ります。

返り値

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

1 if the new element was removed
0 if the new element was not a member of the set
ZINCRBY(key, increment, member)

New in version 1.1.

計算時間: O(log(N)) Nはソート済みセットないの要素数

メンバー member がすでにキー key に対応するソート済みセット内に存在する場合、そのスコアを increment 分だけインクリメントし、ソート済みセット内の正しい位置に更新する。もしメンバーが存在しない場合は increment のスコアを持ったメンバが追加されます。(つまり、仮想的にスコア0を持ったメンバを更新したことになります)もしキーが存在しない場合は指定したメンバーだけを持った新しいソート済みセットが作成されます。もしキーは存在するけれど、対応する値がソート済みセット出ない場合はエラーが返されます。

スコアは倍精度浮動小数を表す文字列です。デクリメントをするために負の値指定することも可能です。

ソート済みセットの紹介はページ上部を確認して下さい。

帰り値

Bulk replyが返ります:

The new score (a double precision floating point number) represented as string.
ZRANK(key, member)

New in version 1.3.4..

ZREVRANK(key, member)

New in version 1.3.4.

計算時間: O(log(N))

ZRANK はキー key に対応するソート済みセット内のメンバ member の昇順でのランクを返します。 ZREVRANK は降順でのランクを返します。指定されたメンバがソート済みセットの中に存在しない場合は特別な値nilが返ります。どちらのコマンドにおいても返されるランク(インデックス)はゼロから始まる値です。

帰り値

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

the rank of the element as an integer reply if the element exists.
A nil bulk reply if there is no such element.
ZRANGE(key, start, end, [WITHSCORES])

New in version 1.1.

ZREVRANGE(key, start, end, [WITHSCORES])

New in version 1.1.

計算時間: O(log(N))+O(M) (Nはソート済みセット内の要素数でMは指定された要素数)

キー key に対応するソート済みセット内での start から end で指定された要素を返します。 ZRANGE では要素は昇順に、 ZREVRANGE では降順に並べられます。 startend は0から始まるインデックスです。0はソート済みセットの最初の要素で1は2番目の要素といった具合です。

startend には負の値を指定することも可能です。その場合はソート済みセットの末尾からのオフセットとなります。たとえば、-1はソート済みセットの末尾の要素、-2は最後から2番目の要素です。

範囲外のインデックスでもエラーは起きません。 start がソート済みセットの末尾を超えた場合、あるいは startend よりも大きい場合は空のリストが返ります。 end が末尾のインデックスよりも大きかった場合は、末尾の要素として扱われます。

値だけではなくて要素のスコアを返せるように WITHSCORES オプションを与えることもできます。Redisはデータをvalue1,score1,value2,score2,...,valueN,scoreNというリストの形で返します。しかしクライアントライブラリはデータをより適切な形で返すことも可能です。(このコマンドで一番良い形なのは2要素のタプルの配列だと思います)

帰り値

Multi bulk replyが返ります。具体的には指定された範囲の要素のリストが返ります。
ZRANGEBYSCORE(key, min, max, [LIMIT, offset, count, [WITHSCORES]])

New in version 1.1.

Changed in version 1.3.4.

ZCOUNT(key, min, max)

計算時間: O(log(N))+O(M) Nはソート済みセット内の要素の数、Mはコマンドによって返される要素の数です。もしMが一定ならO(log(N))となります。(たとえば LIMIT オプションを使って常に最初の要素を取ってくる場合)

キー key に対応するソート済みセット内でスコアが min 以上 max 以下のすべての要素返します。

同じスコアを持っている要素はASCII文字列として数値化されてソートされた結果が返ってきます。(これはRedisソート済みセット型の特徴と一致していてこれ以上の計算はしません)

LIMIT オプションを使うと条件に合う要素をSQLの様に範囲を指定して取ってこれます。オフセットが大きければ、リストをトラバースする必要があるので、O(M)の計算時間がかかることを覚えておいてください。

ZCOUNT コマンドは ZRANGEBYSCORE に似ていますが、実際の要素を返す代わりに条件に適用する要素の数を返します。

排他的な条件や無限大について

minmax は -inf や +inf も使えます。これによってたとえば「ある値以上の値を持つ要素」を取ってきたい時に、どの値が最大値あるいは最小値かを知っておく必要がありません。

値の範囲はデフォルトでは閉じている(内包的)なものですが、”(“の文字を使うことで開いた範囲をしてすることも出来ます。たとえば:

ZRANGEBYSCORE zset (1.3 5

これはスコアが1.3より大きく5以下のすべての要素を返します。一方でこんな例もあります:

ZRANGEBYSCORE zset (5 (10

これはスコアが5より大きく10より小さい要素を返します。(5と10は含まれていません)

帰り値

ZRANGEBYSCORE はMulti bulk replyを返します。具体的には指定された範囲内のスコアを持つ要素のリストです。

ZCOUNT はInteger replyを返します。具体的には指定された範囲内のスコアを持つ要素数です。

redis> zadd zset 1 foo
(integer) 1
redis> zadd zset 2 bar
(integer) 1
redis> zadd zset 3 biz
(integer) 1
redis> zadd zset 4 foz
(integer) 1
redis> zrangebyscore zset -inf +inf
1. "foo"
2. "bar"
3. "biz"
4. "foz"
redis> zcount zset 1 2
(integer) 2
redis> zrangebyscore zset 1 2
1. "foo"
2. "bar"
redis> zrangebyscore zset (1 2
1. "bar"
redis> zrangebyscore zset (1 (2
(empty list or set)
ZREMRANGEBYRANK(key, start, end)

New in version 1.3.4.

計算時間: O(log(N))+O(M) Nはソート済みセット内の要素数、Mは操作によって削除される要素数

ソート済みセット内の start から end 内のランクのすべての要素を削除します。 startend は0から始まるランクで0は最小のスコアを持つ要素です。 start, end ともに負の値をとることもできます。その場合は高いランクからの要素からのオフセットとなります。たとえば-1は最もスコアが高い要素、-2はスコアが2番目に高いものというようになります。

返り値

Integer replyが返ります。具体的には削除された要素数です。
ZREMRANGEBYSCORE(key, min, max)

New in version 1.1.

計算時間: O(log(N))+O(M) Nはソート済みセット内の要素数、Mは操作によって取り除かれた要素数です。

ソート済みセット内の minmax の間のスコアを持つ要素を削除します。( minmax の値は含まれます)

返り値

Integer replyが過ります。具体的には削除された要素数です。
ZCARD(key)

New in version 1.1.

計算時間: O(1)

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

帰り値

Integer replyを返す。具体的には:

the cardinality (number of elements) of the set as an integer.
ZSCORE(key, element)

New in version 1.1.

計算時間: O(1)

キー key に対応するソート済みセット内で指定した要素 element のスコアを返します。もし指定した要素が存在しない、あるいはキー自体が存在しない場合は特別な値nilが返ります。

帰り値

Bulk replyが返ります:

the score (a double precision floating point number) represented as string.
ZUNIONSTORE(dstkey, N, k1, ..., kN, [WEIGHTS, w1, ..., wN], [AGGREGATE, SUM|MIN|MAX])

New in version 1.3.12.

ZINTERSTORE(dstkey, N, k1, ..., kN, [WEIGHTS, w1, ..., wN], [AGGREGATE, SUM|MIN|MAX])

New in version 1.3.12.

計算時間: O(N) + O(M log(M)) Nは入力のソート済みセットのサイズの合計で、Mは返すソート済みセットの要素数。

キー k1 から kN で指定されたN個のソート済みセットの結合あるいは共通部分を作り dstkey に保存します。最初の入力するソート済みセットの数 N の指定は必須です。

言葉が示すように、 ZINTERSTORE コマンドは一致する要素が結果のソート済みセット内に挿入されていく形になります。 ZUNIONSTORE では指定されたソート済みセット内のすべての要素が挿入されます。

WEIGHTS オプションを使うことで、それぞれの入力用ソート済みセットに重みをつけることができます。これはつまり、ソート済みセットのすべての要素はまず重みとして与えられた数との積とされてからアグリゲーションされます。もしオプションが与えられなければ、すべての重みはデフォルトでは1です。

AGGREGATED オプションを使うと、どのように結合あるいは共通部分がアグリゲートされるかを指定することができます。デフォルトのオプションは SUM で、これは要素のスコアが合計されます。 MINMAX の場合は結果のセットにはそれぞれの入力のソート済みセット内の最小値、あるいは最大値の要素が含まれます。

Note

SUM オプションの部分があやしい

帰り値

Integer replyが返ります。具体的にはキー dstkey に対応するソート済みセット内の要素数です。