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
    # 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タイプはインデックスデータの構築にも使用可能