Redis set(集合)
概述:
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
- 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);
返回值:返回添加进集合的个数,不包括重复元素
- scard key
Redis Scard 命令返回集合中元素的数量。
获取集合的成员数
命令示例:
localhost:6379> scard set1
(integer) 4
java示例:
long scard = jedis.scard("jSet1");
//scard:3
System.out.println(scard);
返回值:返回集合元素数量
- 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);
返回值:返回给定或传入所有集合的差集
- 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);
返回值:返回添加进目标集合的元素个数
- 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集合
- 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);
返回值:返回添加进目标集合的元素个数
- 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)
- 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存在且集合中存在至少一个成员则返回所有成员,否则返回空集合
- 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
- 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
- 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值
- 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);
返回值:移除成员的个数
- 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);
- 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);
返回值:返回目标集合个数
- 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);
返回值:返回数组列表