Redis共通コマンド入門4:コレクションタイプ

13780 ワード

集合タイプ


最も基本的な文字列タイプ、ハッシュタイプ、リストタイプについて説明しましたが、集合タイプについて説明します.
集合タイプもredisの比較的高い価値を体現するタイプである.Redisの集合タイプのため,Redisでは差分演算,交差演算,並列演算を容易に実行できる.
まず、集合タイプとリストタイプの違いを紹介しますが、実際にオブジェクト向けの言語を学んだことがある人は、これらのタイプがどんな違いがあるか推測できるはずです.
①コレクションタイプもリストタイプも2^32-1文字列格納可能
②集合タイプは無秩序であり、リストタイプは秩序である
③集合タイプは一意であり、リストタイプの値は一意ではない
文法を見てみましょう.
1、削除要素の追加コマンド
sadd key member [member ...]
srem key member [member ...]

saddコマンドは、集合に要素を追加するために使用されます.もちろん、前の学習経験に基づいて、集合が存在しない場合は、自動的に作成されます.しかし、ここで注意しなければならないのは、要素がすでに存在する場合、上書きせずに無視されます.戻り値は、要素が正常に追加された数です(無視された要素は計算されません).
sremコマンドも同様で、要素を削除し、要素が存在する場合に削除に成功し、戻り値は削除に成功した要素の数です.
2、コレクション内のすべての要素を取得する
smembers key

 
3、要素が集合中かどうかを判断する
sismember key member

 
この判断操作の時間的複雑さはO(1)であり,集合中の要素がいくらあっても,このコマンドは常に結果を迅速に返す.存在は1を返し、存在しない場合やこのキーがない場合は0を返します.
4、集合間演算
sdiff key [key ...]
sinter key [key ...]
sunion key [key ...]

この3つの命令はRedisを活躍させることができる!
まずテストデータを用意します.
127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sadd setC 3 4 5
(integer) 3
127.0.0.1:6379> smembers setA   
1) "1"
2) "2"
3) "3"
127.0.0.1:6379>

 
(1)実際には差分演算であるsdiffコマンドについて説明する.
集合Aと集合Bとの差分演算はA-Bとして表され、Aに属し、Bに属さないすべての要素からなる集合を表す.このコマンドは、AとBが先に差集演算を行い、結果としてCと差集演算を行うことを意味する複数のキーの入力を同時にサポートします.
127.0.0.1:6379> sdiff setA setB
1) "1"
127.0.0.1:6379> sdiff setB setC
1) "2"
127.0.0.1:6379> sdiff setA setB setC
1) "1"

 
(2)次にsinterコマンドを紹介し,このコマンドは複数の集合に対して交差演算を実行するために用いられる.集合Aと集合Bとの交差は、A∩B、すなわち、Aに属しBに属するすべての要素からなる集合として表される.このコマンドは、複数のキーの転送も同時にサポートされ、同様に、一歩一歩交差演算を行います.
127.0.0.1:6379> sinter setA setB
1) "2"
2) "3"
127.0.0.1:6379> sinter setA setB setC
1) "3"

 
(3)最後に,並列演算コマンドsunionについて説明する.集合Aと集合Bの並びは、AにもBにも属する集合を意味する.複数のキー入力もサポートされています.
127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sunion setA setB setC
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

 
5、取得集合中の要素の個数
scard key
127.0.0.1:6379> scard setA
(integer) 3
127.0.0.1:6379> scard setB
(integer) 3

このコマンドは、コレクション内の要素の数を取得するために使用します.同じコレクションが存在しない場合は0を返します.
6、集合演算を行い、結果を記憶する
sdiffstore destination key [key ...]
sinterstore destination key [key ...]
sunionstore destination key [key ...]

ここではすべての集合命令の後にstoreを追加し,格納の意味がはっきりしている.destinationは目的地、つまり私たちが保存するキー名です.
例:
127.0.0.1:6379> sunionstore setAll setA setB setC
(integer) 5
127.0.0.1:6379> smembers setAll
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

 
7、集合中の要素をランダムに取得する
srandmember key [count]

 
このコマンドはランダムに集合から1つの要素を取得するために使用され、countパラメータは1語で複数の要素を取得するために使用され、countの正負によって異なる意味を持つ.
(1)countが正数である場合、count個の重複しない要素を取得し、countがすべての値の個数より大きい場合、すべての要素を返す.
(2)負の値の場合,|count|個の要素が得られるが,同じである可能性がある.
実はこのランダムは非常にランダムではありません.実際にredisの集合はハッシュのストレージ構造を使っているので、興味のある読者は自分で深く研究することができます.
127.0.0.1:6379> srandmember setA 1
1) "1"
127.0.0.1:6379> srandmember setA 2
1) "3"
2) "2"
127.0.0.1:6379> SRANDMEMBER setA 5
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SRANDMEMBER setA -2
1) "3"
2) "3"

8、集合から要素をポップアップする
spop key

以前もlpopとrpopを見たことがありますが、それはリストからポップアップされますが、集合は無秩序なのでspopはランダムにポップアップされます.(ポップアップされた要素は削除され、元のコレクションには含まれません)
127.0.0.1:6379> spop setA 1
1) "2"
127.0.0.1:6379> smembers setA
1) "1"
2) "3"

次に、集合の具体的な応用を例に挙げます.
私たちの文章に格納されているときにラベルtagがあります.これは、リレーショナル・データベースで中間テーブル関連付けを使用する必要があります.しかし、Redisでは、私たちは簡単に処理することができます.
各記事について、post:記事ID:tagsのキーを使用します.タイプは集合で、記事が属するtagsを格納します.これにより、自己関係型データベースには、記事テーブル、ラベルテーブル、中間関係テーブルの3つのテーブルを関連付ける複雑な操作が必要になり、Redisではうまく処理できます.
指定したラベルのすべての文章を取得する必要がある場合もあります.tag:ラベル名:postsの集合タイプキーを追加し、各ラベルの文章IDの集合を格納する必要があります.これにより、あるラベルに属するすべての文章リストを取得するたびに、リレーショナル・データベースのように多くのテーブルを関連付けるのではなく、キーで直接取得することができます.
例えばjavaとredisラベルに同時に属する文章を取得したい場合は、tag:java:postsとtag:redis:postsを交差演算すればOKですが、便利ではないでしょうか.
これで私たちは集合して紹介しました.