redis 数据类型之set 集合


集合简介

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

集合操作命令

sadd

​SADD key member1 [member2]​

向集合添加一个或多个成员

127.0.0.1:6379> sadd set 1 2 3 4 5 1
(integer) 5

通过上面的返回值可以看出,其实存储进去的只有5个值,所以也可以看出set集合是不可重复的。

smembers

​SMEMBERS key​

上面使用了sadd添加命令,往集合中添加了数据。下面我们将集合的成员查询出来:

127.0.0.1:6379> smembers set
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

scard

​SCARD key​

通过scard命令,可以获取集合的成员个数。如下:

127.0.0.1:6379> scard set
(integer) 5

sismember

​SISMEMBER key member​

判断member元素是否是集合key的成员。如果元素是集合中的成员,则返回1,否则返回0。如下:

127.0.0.1:6379> sismember set 1
(integer) 1
127.0.0.1:6379> sismember set 9
(integer) 0

spop

​SPOP key [count]​

spop命令用于移除集合中的指定key的一个或多个随机元素。移除后会返回移除的元素。

127.0.0.1:6379> sadd num 1 2 3 4 5
(integer) 5
127.0.0.1:6379> spop num 1
1) "3"
127.0.0.1:6379> spop num 2
1) "4"
2) "5"
127.0.0.1:6379> smembers num
1) "1"
2) "2"

通过执行结果可以看出,已经将返回的元素删除了。

srandmember

​SRANDMEMBER KEY [count]​

  • 如果count为正数,且小于集合基数,那么命令返回一个包含count个元素的数组,数据中的元素各不相同。如果count大于等于集合基数,那么返回整个集合。
  • 如果count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值。
127.0.0.1:6379> sadd num 1 2 3 4 5
(integer) 5
127.0.0.1:6379> srandmember num 2
1) "3"
2) "2"
127.0.0.1:6379> srandmember num 2
1) "2"
2) "1"
127.0.0.1:6379> srandmember num 5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srandmember num 6
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srandmember num -3
1) "5"
2) "5"
3) "4"

srem

​SREM key member1 [member2]​

srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

127.0.0.1:6379> sadd num 1 2 3 4 5
(integer) 0
127.0.0.1:6379> srem num 1 2 6
(integer) 2
127.0.0.1:6379> smembers num
1) "3"
2) "4"
3) "5"

返回值即被成功移除的元素的数量,不包含的元素忽略。

smove

​SMOVE SOURCE DESTINATION MEMBER​

smove 命令将指定成员member元素从source集合中移动到destination集合中。smove是原子性操作。

  • 如果source集合不存在或是不包含指定的member元素,则smove命令不执行任何操作,仅返回0. 否则,member元素从source集合中被移除,并添加到destination集合中取。
  • 当destination集合中已经包含member元素时,smove命令只是简单地将source集合中的元素删除而已。
  • 当source或destination不是集合类型时,返回错误。
127.0.0.1:6379> smembers num
1) "3"
2) "4"
3) "5"
127.0.0.1:6379> smove num newNum 3 4
(error) ERR wrong number of arguments for 'smove' command
127.0.0.1:6379> smove num newNum 3
(integer) 1
127.0.0.1:6379> smove num newNum 3
(integer) 0
127.0.0.1:6379> smove num newNum 4
(integer) 1
127.0.0.1:6379> smembers num
1) "5"
127.0.0.1:6379> smembers newNum
1) "3"
2) "4"

同时通过执行命令可以看出,执行smove命令时,只允许一次move一个元素。

sinter

​SINTER key1 [key2]​

sinter 命令返回给定所有集合的交集。不存在的集合key视为空集。当给定集合中有一个空集时,结果也为空集(根据集合运算定律)。

127.0.0.1:6379> sadd num1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd num2 3 4 5 6
(integer) 4
127.0.0.1:6379> sinter num1 num2
1) "3"
2) "4"

sinterstore

​SINTERSTORE destination key1 [key2]​

sinterstore 命令将给定集合之间的交集存储在给定的destination集合中。如果指定的集合已经存在了,则将其覆盖。

127.0.0.1:6379> sinterstore num3 num1 num2
(integer) 2
127.0.0.1:6379> smembers num3
1) "3"
2) "4"

sdiff

​SDIFF key1 [key2]​

sdiff 命令返回给定集合之间的差集。不存在的集合key将视为空集。

差集的结果来自前面的first_key, 而不是后面的other_key。如下:

127.0.0.1:6379> sdiff num1 num2
1) "1"
2) "2"
127.0.0.1:6379> sdiff num2 num1
1) "5"
2) "6"

sdiffstore

​SDIFFSTORE destination key1 [key2]​

sdiffstore 命令将给定的集合之间的差集存储到指定的destination集合中。如果指定的集合key已经存在,则会被覆盖。

127.0.0.1:6379> sdiffstore num4 num1 num2
(integer) 2
127.0.0.1:6379> smembers num4
1) "1"
2) "2"
127.0.0.1:6379> sdiffstore num4 num2 num1
(integer) 2
127.0.0.1:6379> smembers num4
1) "5"
2) "6"

sunion

​SUNION key1 [key2]​

sunion 命令返回给定集合的并集。不存在的集合key被视为空集。

127.0.0.1:6379> sunion num1 num2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

sunionstore

​SUNIONSTORE destination key1 [key2]​

sunionstore 命令将给定的集合的并集存储在指定的集合destination中。如果指定集合destination已经存在,则覆盖。

127.0.0.1:6379> sadd num5 11
127.0.0.1:6379> sunionstore num5 num1 num2
(integer) 6
127.0.0.1:6379> smembers num5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

部分参考自菜鸟教程:https://www.runoob.com/redis/redis-sets.html