redisシリーズ:共通の友達のケースを通じてsetコマンドを学ぶ

10826 ワード

前言


この記事では、Redisのsetタイプコマンドについて説明します.同じようにdemoで説明しますが、他の部分はここでは説明しません.
プロジェクトGithubアドレス:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-set

ケース


demo機能は共通の友人で、demo全体の大まかなページは以下の通りです.左はRedisに格納されたデータ、右はRedisからポップアップされたデータです.
[画像のアップロードに失敗しました...(image-16 b 33 d-153245562652)]

準備作業


まずa,bの友達を格納するkeyを定義する
private static final String A_FRIEND_KEY = "friend:a";

private static final String B_FRIEND_KEY = "friend:b";

redis操作オブジェクト
private RedisTemplate redisTemplate;
//string       
private ValueOperations valueOperations;
//set       
private SetOperations setOperations;

setのRedis内の構造は下図(画像はRedis in Actionに由来する)を見ることができる.
[画像のアップロードに失敗しました...(image-2 eb 4 e 5-153249562652)]

友達を追加


コマンドの説明


コマンド#コマンド#
使用例
説明
SADD
SADD key member [member ...]
指定したメンバー要素をセットのkeyに追加
demoの新しい機能を見てみましょう.友達の追加をクリックして、ユーザーAに友達を追加します.
[画像のアップロードに失敗しました...(image-c 54 a 92-1532495862652)]
追加が完了すると、Aには友達1、2、3があり、Bには友達2、3、4があります.
バックグラウンドjavaコードは以下の通りです.
@RequestMapping(value = "/addFriend", method = RequestMethod.POST)
public Long addFriend(String user, String friend) {
    String currentKey = A_FRIEND_KEY;
    if ("B".equals(user)) {
        currentKey = B_FRIEND_KEY;
    }
    //         
    return setOperations.add(currentKey, friend);
}

同じredisコマンドは次のとおりです.
SADD friend:a 1 2 3
SADD friend:b 2 3 4

友達の構成は以下の通りです.
[画像のアップロードに失敗しました...(image-b 0 a 8 c 7-153249562652)]

友達の削除


コマンドの説明


コマンド#コマンド#
使用例
説明
SREM
SREM key member [member ...]
キーセットから指定した要素を除去する
削除機能は次のとおりです.
[画像のアップロードに失敗しました...(image-9373350-1532495862652)]
バックグラウンドjavaコードは以下の通りです.
@RequestMapping(value = "/delFriend", method = RequestMethod.DELETE)
public Long delFriend(String user, String friend) {
    String currentKey = A_FRIEND_KEY;
    if ("B".equals(user)) {
        currentKey = B_FRIEND_KEY;
    }
    //         
    return setOperations.remove(currentKey, friend);
}

同じredisコマンドは次のとおりです.
SREM friend:b 5

リストクエリ


コマンドの説明


コマンド#コマンド#
使用例
説明
SMEMBERS
SMEMBERS key
キーセットのすべての要素を返します.
バックグラウンドjavaコードは以下のように、AとBの友达をそれぞれ検出し、mapに追加します.
@RequestMapping(value = "/getList", method = RequestMethod.GET)
public Map getList() {
    Map map = new HashMap();

    Set aFriend = setOperations.members(A_FRIEND_KEY);
    Set bFriend = setOperations.members(B_FRIEND_KEY);

    map.put("aFriend", aFriend);
    map.put("bFriend", bFriend);

    return map;
}

同じredisコマンドは次のとおりです.
SMEMBERS friend:a
SMEMBERS friend:b

共通の友人.


コマンドの説明


コマンド#コマンド#
使用例
説明
SINTER
SINTER key [key ...]
指定したすべての集合のメンバーの交差を返します.
SINTERSTORE
SINTERSTORE destination key [key ...]
このコマンドはSINTERコマンドと似ていますが、結果セットを直接返すのではなく、destinationセットに保存します.
ページは以下のように、共通の友人ボタンをクリックし、バックグラウンドのデータを取得し、ページの下に共通の友人2、3が表示されます.
[画像のアップロードに失敗しました...(image-84350-1532495862652)]
共通の友达は友达Aと友达Bが共有している友达で、2つのデータが交差すると共有しているデータが得られます.すなわち、A友达∩B友达={1,2,3}∩{2,3,4}={2,3}です.赤い部分が交差する結果です
[画像のアップロードに失敗しました...(image-25 eb 11-153245562652)]
バックグラウンドコードは次のとおりです.
@RequestMapping(value = "/intersectFriend", method = RequestMethod.GET)
public Set intersectFriend() {
    return setOperations.intersect(A_FRIEND_KEY, B_FRIEND_KEY);
}

同じredisコマンドは次のとおりです.
SINTER friend:a friend:b

Aだけの親友


コマンドの説明


コマンド#コマンド#
使用例
説明
SDIFF
SDIFF key [key ...]
集合と所与の集合との差集合の要素を返す.
SDIFFSTORE
SDIFFSTORE destination key [key ...]
このコマンドは、結果セットを返すのではなく、結果をdestinationセットに格納する点で、SDIFFコマンドと同様である.
ページは以下の通り、A独自の友達ボタンをクリックし、バックグラウンドのデータを取得し、ページの下に独自の友達1を表示します.
[画像のアップロードに失敗しました...(image-35 cd 6 c-153245562652)]
A独自の友人とは、Aを取り出した友人がBの友人には現れなかったもの、つまり、Aの友人-Bの友人={1,2,3}-{2,3,4}={1}であり、下の画像の赤い部分が差集の結果である.
[画像のアップロードに失敗しました...(image-b 3766 d-153245562652)]
バックグラウンドjavaコードは以下の通りです.
@RequestMapping(value = "/differenceFriend", method = RequestMethod.GET)
public Set differenceFriend(String user) {
    return setOperations.difference(A_FRIEND_KEY, B_FRIEND_KEY);
}

同じredisコマンドは次のとおりです.
SDIFF friend:a friend:b

すべての友達


コマンドの説明


コマンド#コマンド#
使用例
説明
SUNION
SUNION key [key ...]
与えられた複数の集合の集合内のすべてのメンバーを返す.
SUNIONSTORE
SUNIONSTORE destination key [key ...]
このコマンドは、結果セットを返すのではなく、destinationセットに結果を格納するSUMIONコマンドと同様に機能する.
ページは以下のように、すべての友達ボタンをクリックし、バックグラウンドのデータを取得し、ページの下に共通の友達1、2、3、4が表示されます.
[画像のアップロードに失敗しました...(image-cc 80 d-153245562652)]
すべての友達はAとBの友達で、つまりAの友達とBの友達の同時集で、つまりAの友達のBの友達={1,2,3,4}={1,2,3,4}={1,2,3,4}で、ピクチャーは以下の通りです
[画像のアップロードに失敗しました...(image-9853 f 3-15324595862652)]
バックグラウンドjavaコードは以下の通りです.
@RequestMapping(value = "/unionFriend", method = RequestMethod.GET)
public Set unionFriend() {
    return setOperations.union(A_FRIEND_KEY, B_FRIEND_KEY);
}

同じredisコマンドは次のとおりです.
SUNION friend:a friend:b

その他のコマンド


コマンド#コマンド#
使用例
説明
SCARD
SCARD key
集合に格納keyの基数(集合要素の数)を返す.
SISMEMBER
SISMEMBER key member
メンバーメンバーメンバーが格納集合keyのメンバーであるか否かを返す.
SMOVE
SMOVE source destination member
メンバーをsourceコレクションからdestinationコレクションに移動
SPOP
SPOP key [count]
除去された1つ以上のkeyの要素を返します.
SRANDMEMBER
SRANDMEMBER key [count]
keyセットの1つ以上の要素をランダムに返す
SSCAN
SSCAN key cursor [MATCH pattern][COUNT count]
scanと似ています

SCARDコマンド


集合に格納keyの基数(集合要素の数)を返す.SCARD keyは値を返します:集合の基数(要素の数)、keyが存在しない場合は0を返します.
redisクライアントが実行するコマンドは次のとおりです.
sadd sCardKey 1 2 3
scard sCardKey

次はjavaコードです
@Test
public void sCard() {
    jedis.sadd("sCardKey", "1", "2", "3");

    System.out.println(jedis.scard("sCardKey"));

    //spring redisTemplate
    System.out.println(setOperations.size("sCardKey"));
}

SISMEMBERコマンド


メンバーメンバーメンバーが格納集合keyのメンバーであるか否かを返す.SISMEMBER key member戻り値:member要素がセットkeyのメンバーである場合、1を返します.メンバー要素がkeyのメンバーでない場合、またはコレクションkeyが存在しない場合は0を返します.
redisクライアントが実行するコマンドは次のとおりです.
 sadd sIsMemberKey hello
 sismember sIsMemberKey hello
 sismember sIsMemberKey redis

次はjavaコードです
@Test
public void sIsMember() {
    jedis.sadd("sIsMember", "hello");

    System.out.println(jedis.sismember("sIsMember", "hello"));

    //spring redisTemplate
    System.out.println(setOperations.isMember("sIsMember", "redis"));
}

SMOVEコマンド


メンバーをsourceコレクションからdestinationコレクションに移動する.他のクライアントでは、特定の時間にsourceまたはdestinationの集合のメンバーとして要素が現れる.ソースセットが存在しない場合、または指定された要素が含まれていない場合、smoveコマンドはアクションを実行せず、0を返します.そうでない場合、オブジェクトはsourceコレクションから除去するdestinationコレクションに追加され、destinationコレクションにすでに要素が存在する場合、smoveコマンドはその要素のみをsourceコレクションから除去する.ソースとdestinationがセットタイプでない場合、エラーが返されます.SMOVE source destination member戻り値:要素が正常に除去された場合、1を返します.要素がsourceコレクションのメンバーではなく、アクションがない場合は0を返します.
redisクライアントが実行するコマンドは次のとおりです.
sadd sMoveKeySrc 0 1 2 3 4
smove sMoveKeySrc sMoveKeyDst 5
smove sMoveKeySrc sMoveKeyDst 3
smembers sMoveKeyDst

実行結果は次のとおりです.
[画像のアップロードに失敗しました...(image-244 eec-153249562652)]
次はjavaコードです
@Test
public void sMove() {
    jedis.sadd("sMoveKeySrc", "0", "1", "2", "3", "4");

    System.out.println("          ,  :"+jedis.smove("sMoveKeySrc", "sMoveKeyDst", "5"));

    //spring redisTemplate
    System.out.println("         ,  :" + setOperations.move("sMoveKeySrc","3", "sMoveKeyDst"));

    System.out.println(jedis.smembers("sMoveKeyDst"));
}

SPOPコマンド


1つ以上のランダム要素SPOP key[count]の戻り値を削除して返します:除去された要素、keyが存在しない場合nilを返します
redisクライアントが実行するコマンドは次のとおりです.
sadd sPopKey 0 1 2 3 4
spop sPopKey
spop sPopKey 2
smembers sPopKey

実行結果は次のとおりです.
[画像のアップロードに失敗しました...(image-eec 4 f 4-153249562652)]
次はjavaコードです
@Test
public void sPop() {
    jedis.sadd("sPopKey", "0", "1", "2", "3", "4");

    System.out.println(jedis.spop("sPopKey"));

    //spring redisTemplate
    System.out.println(setOperations.pop("sPopKey", 2));

    System.out.println(jedis.smembers("sPopKey"));

}

SRANDMEMBERコマンド


keyパラメータのみを指定すると、keyセットの要素がランダムに返される.Redis 2.6から、countパラメータを受け入れることができ、countが整数で要素の個数より小さい場合、count個の異なる要素を含む配列を返し、countが整数で集合の要素の個数より大きい場合、集合全体のすべての要素のみを返し、countが負の数である場合、countの絶対値を含む個数要素の配列を返し、countの絶対値が要素の個数より大きい場合、戻る結果セットに1つの要素が複数回現れる.keyパラメータのみを提供する場合、このコマンドはSPOPコマンドと同様に機能するが、SPOPコマンドは選択されたランダム要素をセットから除去するが、SRANDMEMBERはその追記要素を返すだけで、何の操作もしない.
SRANDMEMBER key[count]の戻り値:countパラメータを使用しない場合、このコマンドはランダムな要素を返し、keyが存在しない場合はnilを返す.countパラメータを使用すると、ランダムな要素配列が返され、keyが存在しない場合は空の配列が返されます.
redisクライアントが実行するコマンドは次のとおりです.
sadd sRandMemberKey 0 1 2 3 4
srandmember sRandMemberKey 2
srandmember sRandMemberKey 9
srandmember sRandMemberKey -2
srandmember sRandMemberKey -9

実行結果は次のとおりです.
[画像のアップロードに失敗しました...(image-10 ec 2 b-153249562653)]
次はjavaコードです
@Test
public void sRandMember() {
    jedis.sadd("sRandMemberKey", "0", "1", "2", "3", "4");

    System.out.println("  count  :" + jedis.srandmember("sRandMemberKey"));
    System.out.println("count           :" + jedis.srandmember("sRandMemberKey", 2));
    System.out.println("count                :" + jedis.srandmember("sRandMemberKey", 9));
    System.out.println("count           :" + jedis.srandmember("sRandMemberKey", -2));
    System.out.println("count                :" + jedis.srandmember("sRandMemberKey", -9));

    //spring redisTemplate         
    System.out.println("count   ,           :" + setOperations.randomMembers("sRandMemberKey", 9));
}

やはりその言葉は勉強を勧める人は、命令ごとに叩いて印象を深めたほうがいい.
紙の上で得たのは結局浅く感じて、この事がお辞儀をすることを絶対に知っています。--『冬夜読書示子聿』より