操作系统: ubuntu-16.04-x64
redis版本: 4.0.9
Set又名为集合,集合中的元素具有唯一性,每个元素都是不同的,且没有顺序。一个集合类型的键可以存储至多2^32 - 1个字段。
集合类型的常用操作是向集合中加入或删除,判断某个元素是否存在等,由于集合类型在redis内部使用值为空的散列表实现的,所以这些操作的时间复杂度都是O(1)。
1.增加/删除元素
SADD key member [member ...]
SREM key member [member ...]
SADD命用来向集合中增加一个或多个元素,如果键不存在则自动创建。因为集合元素具有唯一性。本命令返回成功加入的元素数量。
例:
127.0.0.1:6379> SADD set1 a
(integer) 1
127.0.0.1:6379> SADD set1 a b c
(integer) 2
SREM用来删除一个或多个元素,并返回删除成功的个数。
127.0.0.1:6379> SADD set1 a b c
(integer) 3
127.0.0.1:6379> SREM set1 c d
(integer) 1
2.获得集合中的所有元素
SMEMBERS key
例:
127.0.0.1:6379> SADD set1 a b c d
(integer) 4
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "c"
3) "b"
4) "a"
3.判断元素是否在集合中
SISMEMBER key member
当值存在时返回1,否则返回0。
例:
127.0.0.1:6379> SADD set1 a b c d
(integer) 4
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> SISMEMBER set1 a
(integer) 1
127.0.0.1:6379> SISMEMBER set1 e
(integer) 0
4.集合间运算
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]
SDIFF命令用来对多个集合执行差集运算。集合A与集合B的差集表示为A - B,代表所有属于A且不属于B的元素构成的集合,即A - B = {e | e∈A 且 e ∉ B}。例如:
{1,2,3} - {2,3,4} = {1}
{2,3,4} - {1,2,3} = {4}
例:
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SADD set2 2 3 4
(integer) 3
127.0.0.1:6379> SDIFF set1 set2
1) "1"
127.0.0.1:6379> SDIFF set2 set1
1) "4"
SDIFF命令支持同时传入多个键。例如:
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SADD set2 2 3 4
(integer) 3
127.0.0.1:6379> SADD set3 2 3
(integer) 2
127.0.0.1:6379> SDIFF set1 set2 set3
1) "1"
#计算顺序是先计算set1 - set2 ,然后再计算与set3的差集
SINTER命令用来对多个集合执行交集运算。集合A与集合B的交集表示为A∩B,代表属于A且属于B的元素构成的集合,即
A ∩ B = {e | e ∈ A 且 e ∈ B}。例如:
{1,2,3} {2,3,4} = {2,3}
例:
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SADD set2 2 3 4
(integer) 3
127.0.0.1:6379> SINTER set1 set2
1) "2"
2) "3"
SINTER命令同样支持同时传入多个键。
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SADD set2 2 3 4
(integer) 3
127.0.0.1:6379> SADD set3 2 7
(integer) 2
127.0.0.1:6379> SINTER set1 set2 set3
1) "2"
SUNION命令用来对多个集合执行并集操作。集合A与集合B的并集表示为A∪B,代表所有属于A或属于B的元素构成的集合,即A∪B = { e | e ∈ A 或 e ∈ B }。例如:
{1,2,3} ∪ {2,3,4} = {1,2,3,4}
例:
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SADD set2 2 3 4
(integer) 3
127.0.0.1:6379> SUNION set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
SUNION 命令同样支持同时传入多个键,例如:
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SADD set2 2 3 4
(integer) 3
127.0.0.1:6379> SADD set3 3 4 5
(integer) 3
127.0.0.1:6379> SUNION set1 set2 set3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
5.获得集合元素个数
SCARD key
例:
127.0.0.1:6379> SADD set1 1 2 3 4
(integer) 4
127.0.0.1:6379> SCARD set1
(integer) 4
6.进行集合运算并将结果存储
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
SDIFFSTORE 命令和SDIFF命令功能一样,唯一的区别是前者不会直接返回运算结果,而是将结果存储在destination键中。
例:
127.0.0.1:6379> SADD set1 1 2 3 4
(integer) 4
127.0.0.1:6379> SADD set2 2 3 45
(integer) 3
127.0.0.1:6379> SDIFFSTORE set3 set1 set2
(integer) 2
127.0.0.1:6379> SMEMBERS set3
1) "1"
2) "4"
SINTERSTORE和SUNIONSTORE 命令与之类似。
7.随机获得集合中的元素
SRANDMEMBER key [count]
SRANDMEMBER命令用来随机从集合中获取元素,根据count参数的不同,具体表现也不同。
(1)当count为正数时,SRANDMEMBER会随机从集合里获得count个不重复的元素,如果count的值大于集合中的元素个数,则SRANDMEMBER会返回集合中的全部元素。
127.0.0.1:6379> SADD set1 a b c d e
(integer) 5
127.0.0.1:6379> SRANDMEMBER set1 2
1) "b"
2) "e"
127.0.0.1:6379> SRANDMEMBER set1 10
1) "b"
2) "a"
3) "d"
4) "c"
5) "e"
(2)当count为负数时,SRANDMEMBER会随机从集合里获得| count |个元素,这些元素有可能相同。
127.0.0.1:6379> SADD set1 a b c d e
(integer) 5
127.0.0.1:6379> SRANDMEMBER set1 -3
1) "b"
2) "c"
3) "b"
127.0.0.1:6379> SRANDMEMBER set1 -10
1) "c"
2) "b"
3) "b"
4) "c"
5) "c"
6) "e"
7) "b"
8) "c"
9) "c"
10) "e"
8.从集合中弹出一个元素或多个元素
SPOP key [count]
SPOP命令的作用与LPOP类似,但由于集合类型元素的无序性,所以SPOP命令会从集合中随机选择count个元素弹出。
例:
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SPOP set1
"1"
127.0.0.1:6379> SADD set1 1 2 3
(integer) 3
127.0.0.1:6379> SPOP set1 2
1) "3"
2) "2"