Redis共通コマンド入門5:整列集合タイプ

20712 ワード

順序付き集合タイプ


前節では集合タイプを一緒に学び、redisの強さを感じました.次にRedisの最後のタイプである秩序集合タイプについて学びます.
秩序ある集合タイプは、名前から分かるはずですが、実際には集合タイプに秩序をつけているだけです.Redis内の秩序化集合タイプは,実際には集合タイプにおいて,各要素に1つのスコアを関連付け,秩序化は実際にはスコア秩序を表し,スコアの範囲に基づいて集合およびその他の操作を取得する.集合の要素は依然として同じではないが、点数は同じであってもよい.
次に、順序付けされたセットとタイプとリストのタイプの類似点を示します.
①どちらも整然としている(くだらない話!)
②どちらもある範囲の要素を得ることができる
以下に違いを挙げます.
1リストはチェーンテーブルで実現され、両側に近いデータの読み取りが極めて速く、要素が多すぎると中間要素を取得する速度が遅くなる.整列集合タイプで使用されるハッシュとジャンプテーブル(Skip list)が実現されるため,どの部分のデータを読み取るにも差が少ない(時間的複雑度はO(logn)).
②リストでは要素の位置を簡単に調整することはできませんが、順序付き集合は(点数を変更することによって)可能です.
③整列集合比リストにはメモリ(スコア、ハッシュ、ジャンプテーブルを格納する)が必要です.
次に、学習コマンドについて説明します(ここではパラメータキーワードが多いので、以下に挙げたコマンドは、キーワードが大文字で書かれています).
1、元素を増やす
ZADD key score member [score member ...]

ZADDコマンドは、集合に要素を追加するコマンドで、集合にスコアをscoreとするメンバーを追加します.ここでも一度に複数の値を追加することができ、戻り値は増加に成功した要素の個数であり、メンバーが存在する場合、scoreは元のスコアを上書きします.
127.0.0.1:6379> zadd scoreboard 89 tom
(integer) 1     //    
127.0.0.1:6379> zadd scoreboard 70 peter 100 david
(integer) 2     //    
127.0.0.1:6379> zrange scoreboard 0 -1 withscores     
1) "peter"      //     
2) "70"
3) "tom"
4) "89"
5) "david"
6) "100"

Peterの点数入力が間違っていることに気づき、76点に変更する必要があります.このとき、次のコマンドを実行します.
 
127.0.0.1:6379> zadd scoreboard 76 peter
(integer) 0         //member   ,score   ,   score
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "peter"
2) "76"             //70->76
3) "tom"
4) "89"
5) "david"
6) "100"

 
ここでスコアは整数だけでなく浮動小数点数もサポートされます.
 
127.0.0.1:6379> zadd testscore 17e+307 A
(integer) 1
127.0.0.1:6379> zadd testscore 3.3 B
(integer) 1
127.0.0.1:6379> zadd testscore -inf D
(integer) 1
127.0.0.1:6379> zadd testscore +inf C
(integer) 1
127.0.0.1:6379> zrange testscore 0 -1 withscores
1) "D"
2) "-inf"
3) "B"
4) "3.2999999999999998"
5) "A"
6) "1.6999999999999999e+308"
7) "C"
8) "inf"

その中で+infと-infは正負無限の意味である.
2、要素の点数を取る
 ZSCORE 
key member
127.0.0.1:6379> zscore scoreboard peter
"76"

 
3、ある範囲の要素リストを獲得する
ZRANGE key start stop [WITHSCORE]
ZREVRANGE key start stop [WITHSCORE]
ZRANGEコマンドは、startからstopまでのインデックスのすべての要素(両端を含む)を要素スコアの小さい順に返します.ZRANGEはLRANGEコマンドと似ており、インデックスは0から始まり、負数は後進検索(-1が最後)を表します.WITHSCOREは点数をつけるかどうかを表します.
127.0.0.1:6379> zrange scoreboard 0 2
1) "peter"
2) "tom"
3) "david"
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "peter"
2) "76"
3) "tom"
4) "89"
5) "david"
6) "100"
127.0.0.1:6379> zrevrange scoreboard 0 -1 withscores
1) "david"
2) "100"
3) "tom"
4) "89"
5) "peter"
6) "76"

ZRANGEコマンドの時間的複雑度はO(longN+m)であり、nは秩序化された集合の基数であり、mは返される要素の個数である.点数が同じ場合、Redisは辞書順(すなわち、「0」<......<」9〃<」A"<...<」Z"<」a"<...<"z"の順)に並べられます.中国語であれば、符号化後の辞書順に並べ替えられます.
ZREVRANGEコマンドとZRANGEコマンドの唯一の違いは、ZREVRANGEコマンドが点数の大きい順から小さい順に結果を与えることです.
4、指定された点数範囲の要素を獲得する
 
ZRANGEBYSCORE 
key min max [WITHSCORES] [LIMIT offset count]
このコマンドパラメータはたくさんありますが、よく理解できます.このコマンドは、指定したスコア範囲の要素を取得するために使用されます.minは最小値、maxは最大値、WITHSCOREは前述したように、LIMITはオフセット量と数を指定するために使用され、sqlに似ています.offsetはオフセット量、countは数です.また、これらのminとmaxはともに含まれており、含まない場合は「(」記号を使用する必要があります.
 
127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores
1) "tom"
2) "89"
3) "david"
4) "100"
127.0.0.1:6379> zrangebyscore scoreboard (80 100 withscores
1) "tom"
2) "89"
3) "david"
4) "100"
127.0.0.1:6379> zrangebyscore scoreboard 80 (100 withscores
1) "tom"
2) "89"
127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores limit 1 1
1) "david"
2) "100"
127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores limit 1 2
1) "david"
2) "100"
127.0.0.1:6379> zrangebyscore scoreboard 60 +inf withscores
1) "peter"
2) "76"
3) "tom"
4) "89"
5) "david"
6) "100" 

5、ある要素の点数を増やす
 
ZINCRBY 
key incremnet member
127.0.0.1:6379> ZINCRBY scoreboard 2 peter
"78"
127.0.0.1:6379> ZINCRBY scoreboard -5 peter
"73"

このコマンドでは、要素のスコアを追加できます.戻り値は変更後のスコアです.ここでは、INCRBYコマンドと同様に、使い方を説明しません.同様に存在しない場合、初期は0で増加し、負の数は減少します.
6.取得集合内の要素の数
 
ZCARD 
key
この命令はSCARDと似ていて、あまり言わない.
7、指定された点数範囲の要素の個数を獲得する
 
ZCOUNT 
key min max
ここではminとmaxのスコアを得る要素数であり、もちろんここでも「(」記号がサポートされている.
8、1つ以上の要素を削除する
 
ZREM 
key member [member ...]
戻り値は、削除に成功した要素の数です.
127.0.0.1:6379> zrem scoreboard peter
(integer) 1
127.0.0.1:6379> zrange scoreboard 0 -1
1) "tom"
2) "david"

9、ランキング範囲によって要素を削除する
 
ZREMRANGEBYRANK 
key start stop
このコマンドは、指定した範囲内のすべての要素を要素スコアの小さい順に削除し(実際にはソートし、並べ替えられたシーケンスのインデックスで削除します)、削除した要素の数を返します.
10、分数範囲で要素を削除する
 
ZREMRANGEBYSCORE 
key min max
ここでは、スコア範囲を直接削除する要素です.スコアは「(」記号をサポートし、削除数を返します.
11、要素のランキングを獲得する
ZRANK key member
ZREVRANK key member
ZRANKコマンドは、要素のスコアの小さい順に所定の要素の順位(最初は0から)を取得し、ZREVRANKは逆です.
127.0.0.1:6379> zrank scoreboard tom
(integer) 0
127.0.0.1:6379> zrank scoreboard david
(integer) 1

 
最後に実際の応用例を挙げます.
私たちはwordpressの文章をクリック率で並べ替えて、関係データベースは私たちがすべての文章を遍歴してクリック数を並べ替えて、Redisを使うならば、私たちはposts:pageが必要です.viewキーの整列集合タイプは,各memberが文章ID,scoreが文章のクリック量となる.これによりZREVRANGEコマンドでクリック数ランキングを取得できます.
もう1つの実際の例では、記事の公開時間(時間はUNIX時間および時間のミリ秒数)と記事IDを秩序化された集合タイプで保存することで、記事IDでソートすべきではなく、記事リストを時間単位で表示することができます.