JAVAWEB開発のredis学習(五)——SortedSet集合に関する操作命令
一、概説
Sorted-SetsタイプとSetsタイプは非常に似ており、文字列の集合であり、同じSetに重複するメンバーが現れることは許されません.これらの間の主な違いは、Sorted-Setsの各メンバーに1つのスコア(score)が関連付けられていることであり、Redisはスコアによって集合内のメンバーを小さいものから大きいものに並べ替えている.ただし、Sorted-setのメンバーは一意である必要がありますが、スコア(score)は繰り返し可能です.Sorted-setでメンバーを削除または更新するのは非常に迅速な操作であり、その時間的複雑さは集合内のメンバー数の対数であり、Sorted-Setsのメンバーは集合内で秩序化されているため、結合の中央に位置するメンバーにアクセスしても非常に効率的である.実際、Redisが持つこの特徴は他のタイプのデータベースでは実現しにくい.言い換えれば、この点でRedisと同様の効率を達成するには、他のデータベースでのモデリングが非常に困難である.
二、関連コマンドリスト
コマンドフォーマット:コマンドプロトタイプ時間複雑度+コマンド記述戻り値 ZADD key score member [score member ...] O(log(N))時間複雑度のNはSorted-setのメンバの数を表す.パラメータで指定したすべてのメンバーとそのスコアを指定したSorted-setに追加します.このコマンドでは、複数のscore/memberをパラメータとして指定できます.追加時にパラメータのメンバーがすでに存在する場合、コマンドはメンバーのスコアを新しい値に更新し、新しい値に基づいてメンバーを新しいソートします.キーが存在しない場合、このコマンドはキーの新しいSorted-Sets Valueを作成し、score/memberペアを挿入します.キーが既に存在しますが、それに関連付けられているものがSorted-Setsタイプではない場合は、関連するエラーメッセージが返されます.戻り値:この操作で実際に挿入されたメンバーの数. ZCARD key O(1)は、そのkeyに関連付けられたSorted-Setsに含まれるメンバーの数を取得する.Sorted-Setsのメンバー数を返します.keyが存在しない場合は0を返します. ZCOUNT key min max O(log(N)+M)このコマンドは、minとmaxの間のスコア(score)のメンバー数を取得するために使用されます.minとmaxについて追加の説明が必要です.-infと+infはそれぞれSorted-Setsにおけるスコアの最高値と最低値を表す.デフォルトでは、minおよびmaxは範囲が閉区間範囲であることを示します.すなわち、min<=score<=max内のメンバーが返されます.ただし、minとmaxの前に「(」文字を追加することで、(min maxはmin ZINCRBY key increment member O(log(N))このコマンドは、指定したkeyで指定したメンバーに指定したスコアを追加します.メンバーが存在しない場合、コマンドはメンバーを追加し、初期スコアが0であると仮定し、その後、スコアにincrementを追加します.キーが存在しない場合、コマンドはキーとその関連付けられたSorted-Setsを作成し、incrementパラメータのスコアを持つパラメータで指定されたメンバーを含みます.このkeyに関連付けられているSorted-Setsタイプでない場合、香港のエラーメッセージが返されます.戻り値:文字列で表される新しいスコア. ZRANGE key start stop[WITHSCORES]O(log(N)+M)時間複雑度のNはSorted-Setsのメンバーの数を表し、Mは返されるメンバーの数を表す.このコマンドは、パラメータパラメータstartとstopの指定範囲内の順序のメンバーを返します.ここで、startパラメータとstopパラメータはいずれも0-basedです.すなわち、0は最初のメンバーを表し、-1は最後のメンバーを表します.startがSorted-Setsの最大インデックス値より大きい場合、またはstart>stopの場合、空のセットが返されます.stopが最大インデックス値より大きい場合、コマンドはstartからコレクションの最後の要素を返します.コマンドにパラメータWITHSCORESオプションがある場合、このコマンドは、返された結果にvalue 1、score 1、value 2、score 2...などの各メンバーのスコア値をパッケージします.戻り値:startとstopの間のインデックスのメンバーリストを返します. ZRANGEBYSCORE key min max[WITHSCORES][LIMIT offset count]O(log(N)+M)このコマンドは、minとmaxの間のスコアを持つメンバー、すなわち、式min<=score<=maxを満たすメンバーを返します.返されるメンバーは、スコアが低い順から高い順に返され、メンバーが同じスコアを持つ場合は、メンバーの辞書順に返されます.オプションパラメータLIMITは、戻りメンバーの数を制限するために使用します.オプションパラメータoffsetは、条件を満たすoffset番目のメンバーから開始し、countメンバーを返します.オプションパラメータWITHSCORESの意味は、ZRANGEのオプションの説明を参照してください.最後に、パラメータのminとmaxのルールはZCOUNTを参照してください.≪戻り値|Return Value|oem_src≫:指定した範囲内のスコアのメンバー・リストを返します. ZRANKkey member O(log(N))時間的複雑度におけるNは、Sorted-Setsにおけるメンバの数を表す.Sorted-Setsのメンバーは、パラメータで指定したメンバーの位置値を返します.0は最初のメンバーを表し、Sorted-Setsの中で最もスコアの低いメンバーです.メンバーが存在する場合は、その位置インデックス値が返されます.そうでなければnilを返します. ZREM key member [member ...] O(M log(N))時間複雑度でNはSorted-Setsのメンバの数,Mは削除されたメンバの数を表す.このコマンドでは、パラメータで指定したメンバーが除去され、存在しないメンバーは無視されます.キーに関連付けられているタイプがSorted-Setsでない場合.対応するエラーメッセージが返されます.戻り値:実際に削除されたメンバーの数. ZREVRANGE key start stop[WITHSCORES]O(log(N)+M)時間複雑度でNはSorted-Setsのメンバーの数、Mは戻るメンバーの数を表します.このコマンドの機能はZRANGEと基本的に同じであり、唯一の違いは、コマンドが逆ソートによって指定された位置のメンバー、すなわち高い順から低い順を取得することである.メンバーに同じスコアがある場合は、降順辞書順にソートされます.指定したメンバーのリストを返します. ZREVRANK key member o(log(N))時間複雑度中国NはSorted-Setsのメンバー数を表している.このコマンドの機能はZRANKとほぼ同じであり、唯一の違いは、コマンドが取得したインデックスが上位から下位にソートされた位置であり、同じ0が最初の要素、すなわちスコアが最も高いメンバーを表すことである.メンバーが存在する場合は、位置インデックスを返します.そうでない場合はnilを返します. ZSCORE key member O(1)指定keyに関連付けられたSorted-Setsの指定メンバーのスコアを取得し、そのメンバーが存在する場合は文字列としてスコアを返します.そうでない場合はnilを返します. ZREVRANGEBYSCORE key max min[WITHSCORES][LIMIT offset count]O(log(N)+M)時間複雑度のNはSorted-Setsのメンバーの数を表し、Mは返されるメンバーの数を表す.このコマンドは、ソート方式が高から低までのスコアソートに基づいているほか、他の機能およびパラメータの意味はZRANGEBYSCOREと同じである.指定した範囲内のスコアのメンバーのリストを返します. ZREMRANGEBYRANKkey start stop O(log(N)+M)時間的複雑度のNはSorted-Setsのメンバーの数を表し、Mは削除されたメンバーの数を表す.インデックスの場所がstartとstopの間にあるメンバーを削除します.startとstopは0-basedです.つまり、0はスコアが最も低いメンバーを表し、-1は最後のメンバー、すなわちスコアが最も高いメンバーを表します.戻り値:削除されたメンバーの数. ZREMRANGEBYSCORE key min max O(log(N)+M)時間複雑度におけるNはSorted-Setsにおけるメンバの数を表し、Mは削除されたメンバの数を表す.minとmaxのスコアを持つすべてのメンバー、すなわち式min<=score<=maxを満たすすべてのメンバーを削除します.minとmaxパラメータについては,開区間で表すことができる.具体的なルールはZCOUNTを参照してください.戻り値:削除されたメンバーの数.
三、コマンド例は以下の通り
1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK
1)大規模なオンラインゲームに使えるポイントランキング.プレイヤーのスコアが変化するたびにZADDコマンドを実行してプレイヤーのスコアを更新し、その後ZRANGEコマンドでポイントランキングのユーザ情報を取得することができ、もちろんZRANKコマンドでコマンドを取得してusernameでプレイヤーのランキング情報を取得することもできる.最後に、ZRANGEコマンドとZRANKコマンドを組み合わせて、あるプレイヤーのポイントに近い他のユーザ情報を取得します.
2)Sorted-Setsタイプはインデックスデータの構築にも使用可能
Sorted-SetsタイプとSetsタイプは非常に似ており、文字列の集合であり、同じSetに重複するメンバーが現れることは許されません.これらの間の主な違いは、Sorted-Setsの各メンバーに1つのスコア(score)が関連付けられていることであり、Redisはスコアによって集合内のメンバーを小さいものから大きいものに並べ替えている.ただし、Sorted-setのメンバーは一意である必要がありますが、スコア(score)は繰り返し可能です.Sorted-setでメンバーを削除または更新するのは非常に迅速な操作であり、その時間的複雑さは集合内のメンバー数の対数であり、Sorted-Setsのメンバーは集合内で秩序化されているため、結合の中央に位置するメンバーにアクセスしても非常に効率的である.実際、Redisが持つこの特徴は他のタイプのデータベースでは実現しにくい.言い換えれば、この点でRedisと同様の効率を達成するには、他のデータベースでのモデリングが非常に困難である.
二、関連コマンドリスト
コマンドフォーマット:コマンドプロトタイプ時間複雑度+コマンド記述戻り値
三、コマンド例は以下の通り
1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK
# Shell Redis 。
/> redis-cli
# 1 。
redis 127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
# 2 3 。
redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three"
(integer) 2
#0 ,-1 。WITHSCORES , 。
redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
# one Sorted-Set 。0 。
redis 127.0.0.1:6379> zrank myzset one
(integer) 0
# four , nil。
redis 127.0.0.1:6379> zrank myzset four
(nil)
# myzset 。
redis 127.0.0.1:6379> zcard myzset
(integer) 3
# myzset Sorted-Set , 1 <= score <= 2 。
redis 127.0.0.1:6379> zcount myzset 1 2
(integer) 2
# one two, 。
redis 127.0.0.1:6379> zrem myzset one two
(integer) 2
# 。
redis 127.0.0.1:6379> zcard myzset
(integer) 1
# three 。 。
redis 127.0.0.1:6379> zscore myzset three
"3"
# two , nil。
redis 127.0.0.1:6379> zscore myzset two
(nil)
# one 2, 。
redis 127.0.0.1:6379> zincrby myzset 2 one
"3"
# one -1, 。
redis 127.0.0.1:6379> zincrby myzset -1 one
"2"
# 。
redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "2"
3) "two"
4) "2"
5) "three"
6) "3"
2. ZRANGEBYSCORE/ZREMRANGEBURANK/ZREMRANGEBYSCORE redis 127.0.0.1:6379> del myzset
(integer) 1
redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
(integer) 4
# 1 <= score <= 2 。
redis 127.0.0.1:6379> zrangebyscore myzset 1 2
1) "one"
2) "two"
# 1 < score <= 2 。
redis 127.0.0.1:6379> zrangebyscore myzset (1 2
1) "two"
#-inf ,+inf ,limit ,
#2 (0-based) 2 , 3 。
redis 127.0.0.1:6379> zrangebyscore myzset -inf +inf limit 2 3
1) "three"
2) "four"
# 1 <= score <= 2 , 。
redis 127.0.0.1:6379> zremrangebyscore myzset 1 2
(integer) 2
# 。
redis 127.0.0.1:6379> zrange myzset 0 -1
1) "three"
2) "four"
# 0 <= rank <= 1 。
redis 127.0.0.1:6379> zremrangebyrank myzset 0 1
(integer) 2
# 。
redis 127.0.0.1:6379> zcard myzset
(integer) 0
3. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK # 。
redis 127.0.0.1:6379> del myzset
(integer) 0
redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
(integer) 4
# 。
redis 127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
# , 0 four,1 three, 。
redis 127.0.0.1:6379> zrevrange myzset 1 3
1) "three"
2) "two"
3) "one"
# , one 3。
redis 127.0.0.1:6379> zrevrank myzset one
(integer) 3
# , four 0。
redis 127.0.0.1:6379> zrevrank myzset four
(integer) 0
# 3 >= score >= 0 , , 。
redis 127.0.0.1:6379> zrevrangebyscore myzset 3 0
1) "three"
2) "two"
3) "one"
# limit , zrangebyscore , 。
redis 127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2
1) "three"
2) "two"
四、応用範囲1)大規模なオンラインゲームに使えるポイントランキング.プレイヤーのスコアが変化するたびにZADDコマンドを実行してプレイヤーのスコアを更新し、その後ZRANGEコマンドでポイントランキングのユーザ情報を取得することができ、もちろんZRANKコマンドでコマンドを取得してusernameでプレイヤーのランキング情報を取得することもできる.最後に、ZRANGEコマンドとZRANKコマンドを組み合わせて、あるプレイヤーのポイントに近い他のユーザ情報を取得します.
2)Sorted-Setsタイプはインデックスデータの構築にも使用可能