Redis set(集合)

概述:

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

  1. sadd key member1 [member1]
    Redis Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
    假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
    当集合 key 不是集合类型时,返回一个错误。
    **注意:**在Redis2.4版本以前, SADD 只接受单个成员值。
    向集合添加一个或多个成员
    命令示例:
localhost:6379> sadd set1 "java" "c++" "c" "python"
	integer) 4

java示例:

long len = jedis.sadd("jSet1", "java", "javaScript", "mysql");
    //len:3
    System.out.println(len);

返回值:返回添加进集合的个数,不包括重复元素

  1. scard key
    Redis Scard 命令返回集合中元素的数量。
    获取集合的成员数
    命令示例:
localhost:6379> scard set1
    (integer) 4

java示例:

long scard = jedis.scard("jSet1");
    //scard:3
    System.out.println(scard);

返回值:返回集合元素数量

  1. sdiff key1 [key2]
    返回给定所有集合的差集
    也就是返回几个set集合的不相同元素
    命令示例:
localhost:6379> sdiff set1 jset1
    1) "c++"
    2) "python"
    3) "c"
    localhost:6379> sadd jset1 "c"
    (integer) 1
    localhost:6379> sdiff set1 jset1
    1) "c++"
    2) "python"

java示例:

Set<String> set = jedis.sdiff("jset1", "set1");
    //set:[javaScript, mysql]
    System.out.println(set);

返回值:返回给定或传入所有集合的差集

  1. sdffstore destination key1 [key2]
    返回给定所有集合的差集并存储在destination(目标set集合)中
    Redis Sdiffstore 命令将给定集合之间的差集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。
    命令示例:
localhost:6379> sdiffstore set2 set1 jset1
    (integer) 2
    localhost:6379> smembers set2
    1) "c++"
    2) "python"

java示例:

long len = jedis.sdiffstore("jset2", "set1", "jset1");
    //len:2
    System.out.println(len);

返回值:返回添加进目标集合的元素个数

  1. sinter key1 [key2]
    返回给定所有集合的交集
    Redis Sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
    命令示例:
localhost:6379> sinter set1 jset1
    1) "c"
    2) "java"
    localhost:6379> smembers set1
    1) "python"
    2) "c++"
    3) "c"
    4) "java"
    localhost:6379> smembers jset2
    1) "c++"
    2) "python"

java示例:

Set<String> sinter = jedis.sinter("set1", "jset2");
    //sinter:[c++, python]
    System.out.println(sinter);

返回值:返回一个set集合

  1. sinterstore destination key1 [key2]
    返回给定所有集合的交集并存储在destination(目标set集合)
    Redis Sinterstore 命令将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖。
    命令示例:
localhost:6379> sinterstore set3 set1 jset1
    (integer) 2
    localhost:6379> smembers set3
    1) "java"
    2) "c"
    localhost:6379> smembers set1
    1) "python"
    2) "c++"
    3) "c"
    4) "java"
    localhost:6379> smembers jset1
    1) "javaScript"
    2) "mysql"
    3) "c"
    4) "java"

java示例:

long len = jedis.sinterstore("jset3", "set1", "jset1");
    //len:2
    System.out.println(len);

返回值:返回添加进目标集合的元素个数

  1. sismember key member
    判断member是否是集合key的成员
    Redis Sismember 命令判断成员元素是否是集合的成员。
    命令示例:
localhost:6379> sismember set1 "c++"
    (integer) 1
    localhost:6379> sismember set1 "mysql"
    (integer) 0

java示例:

boolean mysql = jedis.sismember("jset1", "mysql");
    boolean cpp = jedis.sismember("jset1", "c++");
    //mysql:true
    System.out.println(mysql);
    //cpp:false
    System.out.println(cpp);

返回值:如果是成员则返回1(true),否则返回0,或者key不存在时返回0(false)

  1. smembers key
    返回集合中的所有成员
    Redis Smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合。
    命令示例:
localhost:6379> smembers set1
    1) "python"
    2) "c++"
    3) "c"
    4) "java"
    localhost:6379> smembers jset3
    1) "java"
    2) "c"
    localhost:6379> smembers not
	(empty list or set)

java示例:

Set<String> set1 = jedis.smembers("set1");
    Set<String> jset1 = jedis.smembers("jset1");
    //set1:[python, c++, c, java]
    System.out.println(set1);
    //jset1:[c, java, javaScript, mysql]
    System.out.println(jset1);
    //not:[]
    System.out.println(not);

返回值:当key存在且集合中存在至少一个成员则返回所有成员,否则返回空集合

  1. smove source destination member
    将member元素从source(原set集合)集合移动到destination集合(目标set集合)
    Redis Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合。
    SMOVE 是原子性操作。
    如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
    当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
    当 source 或 destination 不是集合类型时,返回一个错误。
    命令示例:
localhost:6379> smove set1 jset3 "python"
    (integer) 1
    localhost:6379> smembers set1
    1) "c++"
    2) "c"
    3) "java"
    localhost:6379> smembers jset3
    1) "python"
    2) "java"
    3) "c"

java示例:

long smove = jedis.smove("jset3", "set1", "python");
    //smove:1
    System.out.println(smove);

    Set<String> jset3 = jedis.smembers("jset3");
    //jset3:[java, c]
    System.out.println(jset3);
    Set<String> set1 = jedis.smembers("set1");
    //set1:[python, c++, c, java]
    System.out.println(set1);

返回值:如果成员元素被成功移除,返回 1 。 如果成员元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0

  1. spop key
    移除并返回集合中的一个随机元素
    Redis Spop 命令用于移除并返回集合中的一个随机元素。
    命令示例:
localhost:6379> spop set1
    "python"
    localhost:6379> smembers set1
    1) "c++"
    2) "c"
    3) "java"

java示例:

String pop = jedis.spop("jset1");
    //pop:mysql
    System.out.println(pop);

    Set<String> jset1 = jedis.smembers("jset1");
    //jset1:[c, java, javaScript]
    System.out.println(jset1);

返回值:被移除的随机元素。 当集合不存在或是空集时,返回 nil

  1. srandmember key [count]
    返回集合中一个或多个随机数
    Redis Srandmember 命令用于返回集合中的一个随机元素。
    从 Redis 2.6 版本开始, Srandmember 命令接受可选的 count 参数:
    如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不 相同。如果 count 大于等于集合基数,那么返回整个集合。
    如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
    该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。
    命令示例:
localhost:6379> srandmember set1 0
    (empty list or set)
    localhost:6379> srandmember set1 -1
    1) "c"
    localhost:6379> srandmember set1 1
    1) "c++"
    localhost:6379> srandmember set1 2
    1) "java"
    2) "c"
    localhost:6379> srandmember set1
	"java"

java示例:

String rand1 = jedis.srandmember("jset1");
    //rand1:c
    System.out.println(rand1);
    List<String> rand2 = jedis.srandmember("jset1", 2);
    //rand2:[java, c]
    System.out.println(rand2);

返回值:集合或者字符串,根据传入count值

  1. srem key member1 [member2]
    移除集合一个或多个成员
    Redis Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
    当 key 不是集合类型,返回一个错误。
    在 Redis 2.4 版本以前, SREM 只接受单个成员值。
    命令示例:
localhost:6379> smembers set1
    1) "c++"
    2) "c"
    3) "java"
    localhost:6379> srem set1 "c++" "c"
    (integer) 2
    localhost:6379> smembers set1
    1) "java"

java示例:

Set<String> before = jedis.smembers("jset1");
    //before:[c, java, javaScript]
    System.out.println(before);
    long len = jedis.srem("jset1", "c", "javaScript");
    //len:2
    System.out.println(len);
    Set<String> after = jedis.smembers("jset1");
    //after:[java]
    System.out.println(after);

返回值:移除成员的个数

  1. sunion key1 [key2]
    返回所有给定集合的并集
    Redis Sunion 命令返回给定集合的并集。不存在的集合 key 被视为空集
    命令示例:
localhost:6379> smembers set1
    1) "python"
    2) "c++"
    3) "c"
    4) "java"
    localhost:6379> smembers jset1
    1) "mysql"
    2) "python"
    3) "php"
    4) "java"
    5) "c++"
    localhost:6379> sunion set1 jset1
    1) "python"
    2) "c"
    3) "java"
    4) "c++"
    5) "mysql"
    6) "php"

java示例:

Set<String> sunion = jedis.sunion("jset1", "set1");
    //sunion:[python, c++, c, java, php, mysql]
    System.out.println(sunion);
  1. sunionstrore destination key1 [key2]
    所有给定集合的并集存储在destination集合中
    Redis Sunionstore 命令将给定集合的并集存储在指定的集合 destination 中
    命令示例:
localhost:6379> smembers set1
    1) "python"
    2) "c++"
    3) "c"
    4) "java"
    localhost:6379> smembers jset1
    1) "mysql"
    2) "python"
    3) "php"
    4) "java"
    5) "c++"
    localhost:6379> sunion set1 jset1
    1) "python"
    2) "c"
    3) "java"
    4) "c++"
    5) "mysql"
    6) "php"
    localhost:6379> sunionstore union1 set1 jset1
    (integer) 6
    localhost:6379> smembers union1
    1) "python"
    2) "c"
    3) "java"
    4) "c++"
    5) "mysql"
    6) "php"

java示例:

long len = jedis.sunionstore("junion1", "jset1", "set1");
    //len:6
    System.out.println(len);
    Set<String> junion1 = jedis.smembers("junion1");
    //junion1:[python, c++, c, java, php, mysql]
    System.out.println(junion1);

返回值:返回目标集合个数

  1. sscan key cursor [match pattern] [count count]
    迭代集合中的元素
    cursor:游标
    match pattern:匹配
    count:返回条目,默认为10
    命令示例:
localhost:6379> smembers union1
    1) "python"
    2) "c"
    3) "java"
    4) "c++"
    5) "mysql"
    6) "php"
    localhost:6379> sscan union1 0 match p*
    1) "0"
    2) 1) "python"
       2) "php"

java示例:

ScanParams params = new ScanParams();
    params.match("p*");
    //params.count(5);
    ScanResult<String> sscan = jedis.sscan("junion1", "0", params);
    List<String> result = sscan.getResult();
    //result:[python, php]
    System.out.println(result);

返回值:返回数组列表