phpにおけるredisの応用(Sorted-set編)

15840 ワード

Redis秩序化集合は、集合と同様にstringタイプ要素の集合であり、重複するメンバーは許可されません.異なるのは、各要素がdoubleタイプのスコアに関連付けられていることです.redisは、集合内のメンバーをスコアで小さいものから大きいものに並べ替えるものです.秩序化された集合のメンバーは一意ですが、スコア(score)は繰り返すことができます.集合はハッシュテーブルによって実現されるので,追加,削除,検索の複雑さはいずれもO(1)である.
Sorted-set(整列集合)
1、ZADD
Redis Zaddコマンドは、1つまたは複数のメンバー要素とその分割値を秩序セットに追加するために使用されます.(スコア値は、整数値または二重精度浮動小数点数であってもよい.)(1)メンバーが既に整列セットのメンバーである場合、そのメンバーのスコア値を更新し、そのメンバー要素を再挿入することで、メンバーが正しい位置にいることを保証します.(2)順序セットkeyが存在しない場合、空の順序セットを作成し、ZADD操作を実行する.(3)keyが存在するが順序セットタイプではない場合、エラーが返される.注意:Redis 2.4リリース以前は、ZADDは1回に1つの要素しか追加できませんでした.戻り値:更新された既存のメンバーを含まない、正常に追加された新しいメンバーの数.
 connect('127.0.0.1',6379);
//$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');

var_dump($redis -> zRange('myset',0,-1,'withScores'));
//array (size=5)
//  'hello' => float 0
//  'foo' => float 1
//  'world' => float 1
//  'hi' => float 2
//  'welcome' => float 2.5

$redis -> zAdd('myset',3,'hi');     // hi     myset    ,                  
var_dump($redis -> zRange('myset',0,-1,'withScores'));
//array (size=5)
//  'hello' => float 0
//  'foo' => float 1
//  'world' => float 1
//  'welcome' => float 2.5
//  'hi' => float 3

2、ZREM
Redis Zremコマンドは、存在しないメンバーは無視されます.keyが存在するが順序セットタイプではない場合、エラーが返されます.注意:ZREMは、Redis 2.4リリース以前は1回に1つの要素しか削除できませんでした.
redis 127.0.0.1:6379> ZREM key member

php構文:
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');

$redis ->zRem('myset','hi');          //           
var_dump($redis -> zRange('myset',0,-1,'withScores'));
//array (size=4)
//  'hello' => float 0
//  'foo' => float 1
//  'world' => float 1
//  'welcome' => float 2.5

3、ZCARD
Redis Zcardコマンドは、コレクション内の要素の数を計算するために使用します.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');

var_dump($redis ->zCard('myset'));          // int 5

4、ZCOUNT
Redis Zcountコマンドは、順序セットで指定されたスコア区間のメンバー数を計算するために使用します.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

// 1  3      5 
var_dump($redis ->zCount('myset',1,3));          // int 5


5、ZSCORE
Redis Zscoreコマンドは、順序セット、メンバーのスコア値を返します.メンバー要素が整列セットkeyのメンバーでない場合、またはkeyが存在しない場合はnilを返します.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

//    foo     
var_dump($redis ->zScore('myset','foo'));          // float 1

6、ZINCRBY
Redis Zincrbyコマンドは、整列セットで指定したメンバーのスコアに増分incrementを加算します(スコアは整数値または二重精度浮動小数点数です).(1)負の数値incrementを渡すことで、スコアから対応する値、例えばZINCRBY key-5 memberを減算することができ、memberのscore値から5を減算することができる.(2)keyが存在しない場合、またはスコアがkeyのメンバーでない場合、ZINCRBY key increment memberはZADD key increment memberに等しい.(3)keyがシーケンスセットタイプでない場合、エラーが返される.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

//   world      0.6
var_dump($redis ->zIncrBy('myset',0.6,'world'));          // float 1.6

//   score     1.2
var_dump($redis ->zIncrBy('myset',-1.2,'score'));          // float 1.8

7、ZRANGE
Redis Zrangeは、区間内のメンバーを指定する順序セットを返します.(メンバーの位置は、小数点以下から小数点以下)でソートされます.同じスコア値を持つメンバーは、辞書順(lexicographical order)に並べられます.)メンバーを値の増減(大から小)で並べ替える必要がある場合は、ZREVRANGEコマンドを使用します.下付きパラメータstartおよびstopはいずれも0をベースとし、すなわち、0で秩序セットの最初のメンバーを表し、1で秩序セットの2番目のメンバーを表す.負数の下付き記号を使用して、最後のメンバーを-1、最後から2番目のメンバーを-2で表すこともできます.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');
var_dump($redis ->zRange('myset',0,-1,'withScore'));

8、ZREVRANGE
Redis Zrevrangeコマンドは、区間内のメンバーを指定する順序セットを返します.ここで、メンバーの位置は、数値的に減算(大きいから小さい)されます.同じスコア値を持つメンバーは、辞書順の逆順序(reverse lexicographical order)で並べ替えられます.ZREVRANGEコマンドの他の態様は、メンバーが数値的に減少する順序で並べられている点を除いて、ZRANGEコマンドと同様である.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');      //          ,        
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

var_dump($redis ->zRevRange('myset',0,-1,'withScore'));

9、ZRANGEBYSCORE
Redis Zremrangebyscoreコマンドは、順序セットを削除し、スコア区間内のすべてのメンバーを指定します.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

var_dump($redis ->zRangeByScore('myset',2,3));
//array (size=3)
//  0 => string 'hi' (length=2)
//  1 => string 'welcome' (length=7)
//  2 => string 'score' (length=5)

var_dump($redis ->zRangeByScore('myset','-inf','+inf'));    //                  
//array (size=6)
//  0 => string 'hello' (length=5)
//  1 => string 'foo' (length=3)
//  2 => string 'world' (length=5)
//  3 => string 'hi' (length=2)
//  4 => string 'welcome' (length=7)
//  5 => string 'score' (length=5)

var_dump($redis -> zRange('myset',0,-1,'withScore'));       //      
//array (size=6)
//  'hello' => float 0
//  'foo' => float 1
//  'world' => float 1
//  'hi' => float 2
//  'welcome' => float 2.5
//  'score' => float 3

10、ZREVRANGEBYSCORE
Redis Zrevrangebyscoreは、指定されたスコア区間内のすべてのメンバーを秩序セットで返します.秩序セットのメンバーは、数値の増減(大きいから小さい)の順に並べられます.
同じスコア値を持つメンバーは、辞書順の逆順序(reverse lexicographical order)で並べ替えられます.
ZREVRANGEBYSCOREコマンドの他の態様は、メンバーが数値的に減少する順序で並べられている点を除いて、ZRANGGEBYSCOREコマンドと同様である.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

var_dump($redis ->zRevRangeByScore('myset',3,2));
//array (size=3)
//  0 => string 'score' (length=5)
//  1 => string 'welcome' (length=7)
//  2 => string 'hi' (length=2)

var_dump($redis ->zRevRangeByScore('myset','+inf','-inf'));    //                  
//array (size=6)
//  0 => string 'score' (length=5)
//  1 => string 'welcome' (length=7)
//  2 => string 'hi' (length=2)
//  3 => string 'world' (length=5)
//  4 => string 'foo' (length=3)
//  5 => string 'hello' (length=5)

var_dump($redis -> zRange('myset',0,-1,'withScore'));       //      
//array (size=6)
//  'hello' => float 0
//  'foo' => float 1
//  'world' => float 1
//  'hi' => float 2
//  'welcome' => float 2.5
//  'score' => float 3

11、ZREMRANGEBYSCORE
Redis Zremrangebyscoreコマンドは、指定されたスコア区間内のすべてのメンバーを削除するために使用されます.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');      // score=0
$redis -> zAdd('myset',1,'world');      // score=2
$redis -> zAdd('myset',1,'foo');        // score=1
$redis -> zAdd('myset',2,'hi');         // score=2
$redis -> zAdd('myset',2.5,'welcome');  // score=2.5
$redis -> zAdd('myset',3,'score');      // score=3

var_dump($redis ->zRemRangeByScore('myset',1,3));    // int 5

var_dump($redis ->zRange('myset',0,-1,'withScore'));
//array (size=1)
//  'hello' => float 0

12、ZINTER
Redis Zinterコマンドは、与えられた1つまたは複数の順序セットの交差を計算する.(cmdコマンドでのredisのZINTERTOREと同じ役割を果たす)
デフォルトでは、結果セットのメンバーのスコア値は、指定されたすべてのセットのメンバーのスコア値の和です.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');      // score=0
$redis -> zAdd('myset',1,'world');      // score=2
$redis -> zAdd('myset',1,'foo');        // score=1
$redis -> zAdd('myset',2,'hi');         // score=2
$redis -> zAdd('myset',2.5,'welcome');  // score=2.5
$redis -> zAdd('myset',3,'score');      // score=3

$redis -> zAdd('otherset',0,'good');
$redis -> zAdd('otherset',1,'hello');
$redis -> zAdd('otherset',2,'world');

$array_set = array('myset','otherset');
var_dump($redis ->zInter('destinationset',$array_set));    // int 2
var_dump($redis ->zRange('destinationset',0,-1,'withScore'));
//array (size=2)
//  'hello' => float 1
//  'world' => float 3

13、ZUNION
Redis Zunionstoreコマンドは、与えられた1つまたは複数の順序セットの並列セットを計算する.(cmdにおけるredisのZUNIOnstorEと同様の役割を果たす)
デフォルトでは、結果セットのメンバーのスコア値は、指定されたすべてのセットのメンバーのスコア値の和です.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');      // score=0
$redis -> zAdd('myset',1,'world');      // score=2
$redis -> zAdd('myset',1,'foo');        // score=1
$redis -> zAdd('myset',2,'hi');         // score=2
$redis -> zAdd('myset',2.5,'welcome');  // score=2.5
$redis -> zAdd('myset',3,'score');      // score=3

$redis -> zAdd('otherset',0,'good');    // score=0
$redis -> zAdd('otherset',1,'hello');   // score=1
$redis -> zAdd('otherset',2,'world');   // score=2

$array_set = array('myset','otherset');
var_dump($redis ->zUnion('destinationset',$array_set));    // int 7
var_dump($redis ->zRange('destinationset',0,-1,'withScore'));
//array (size=7)
//  'good' => float 0
//  'foo' => float 1
//  'hello' => float 1
//  'hi' => float 2
//  'welcome' => float 2.5
//  'score' => float 3
//  'world' => float 3

14、ZRANK
Redis Zrankは、指定されたメンバーの順序付けセットの順位を返します.ここで、順序付けされたセットメンバーは、小数点以下から大きい順に並べられます.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

var_dump($redis ->zRank('myset','welcome'));    // int 4

15、ZREVRANK
Redis Zrevrankコマンドは、順序セットのメンバーの順位を返します.ここで、整列セットのメンバーは、大きな値から小さい値への減算でソートされます.
ランキングは0を下回り、つまり点数が一番大きいメンバーは0となります.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');
$redis -> zAdd('myset',1,'world');
$redis -> zAdd('myset',1,'foo');
$redis -> zAdd('myset',2,'hi');
$redis -> zAdd('myset',2.5,'welcome');
$redis -> zAdd('myset',3,'score');

var_dump($redis ->zRevRank('myset','welcome'));    // int 1

16、ZREMRANGEBYRANK
Redis Zremrangebyrankコマンドを使用して、順序セットで指定されたランキング(rank)区間内のすべてのメンバーを削除します.
 connect('127.0.0.1',6379);
$redis -> flushAll();

$redis -> zAdd('myset',0,'hello');      // rank=0
$redis -> zAdd('myset',1,'world');      // rank=2
$redis -> zAdd('myset',1,'foo');        // rank=1
$redis -> zAdd('myset',2,'hi');         // rank=3
$redis -> zAdd('myset',2.5,'welcome');  // rank=4
$redis -> zAdd('myset',3,'score');      // rank=5

var_dump($redis ->zRemRangeByRank('myset',1,3));    // int 3

var_dump($redis ->zRange('myset',0,-1,'withScore'));

転載先:https://www.cnblogs.com/chrdai/p/6851731.html