Redis学习手册之集合
集合简介
Redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中(类似于Java中的Set),这些数据既可以是文本数据,也可以是二进制数据。
集合与列表的区别
与上一章中介绍的列表键的区别如下所示:
- 列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已经存在的元素添加到集合中将被忽略。
- 列表以有序的方式存储元素,而集合以无序的方式存储元素。
- 在执行像LINSERT和LREM这样的列表命令时,即使命令只针对单个列表元素,程序有时也不得不遍历整个列表确定指定的元素是否存在,因此这些命令复杂度都为 O ( N ) O(N) O(N)。
- 对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以复杂度都为 O ( 1 ) O(1) O(1)。
集合键的功能
Redis为集合键提供了一系列操作命令,通过使用这些命令,用户可以:
- 将新元素添加到集合中,或者从集合中移除已有的元素;
- 将指定元素从一个集合移动到另一个集合;
- 获取集合包含的所有元素;
- 获取集合中包含的元素数量;
- 检查给定元素是否存在于集合中;
- 从集合中随机地获取指定数量的元素;
- 对多个集合执行交集、并集、差集计算;
集合命令速查表
命令 | 用法及参数 | 说明 |
---|---|---|
SADD | SADD set element [element ...] | 添加一个或多个元素到集合中 |
SREM | SREM set element [element ...] | 从集合中移除一个或多个元素 |
SMOVE | SMOVE source target element | 将指定元素从源集合移动到目标集合 |
SMEMBERS | SMEMBERS set | 获取集合中的所有元素 |
SCARD | SCARD set | 获取给定集合的大小,即集合元素数 |
SISMEMBER | SISMEMBER set element | 检查给定的元素是否存在于集合中 |
SRANDMEMBER | SRANDMEMBER set [count] | 从集合中随机的获取指定数量的元素 |
SPOP | SPOP key [count] | 随机的从集合中移除指定数量的元素 |
SINSERT | SINSERT set [set ...] | 计算出给定的所有集合的交集 |
SINSEERSTORE | SINSERTSTORE destination set [set ...] | 计算交集并将交集存储到目标集合中 |
SUNION | SUNION set [set ...] | 计算给定所有集合的并集 |
SUNIONSTORE | SUNIONSTORE destination_key set [set ...] | 计算所有集合的并集,并将并集存储到指定的键中 |
SDIFF | SDIFF set [set ...] | 计算给定所有集合的差集 |
SDIFFSTORE | SDIFFSTORE destination_key set [set ...] | 计算差集并存储到指定键中 |
命令详解
通过使用SADD命令,可以将一个或多个元素添加到集合中:
SADD set element [element ...]
执行成功返回新添加的元素数量作为返回值。
127.0.0.1:6379> SADD database "Redis"
(integer) 1
127.0.0.1:6379> SADD database "MongoDB" "MySQL"
(integer) 2
忽略已存在的元素
因为集合元素不能存储相同的元素,所以用户在使用SADD命令向集合中添加元素的时候,SADD命令会自动忽略已存在的元素,只将不存在的元素添加到集合中:
127.0.0.1:6379> SADD database "Redis"
(integer) 0 --表示未将元素添加到集合中
复杂度:
O
(
N
)
O(N)
O(N),其中
N
N
N为给定的元素数量。
版本要求:SADD命令从Redis 1.0.0版本开始可用,但是只有 Redis 2.4.0及以上版本支持一次添加多个元素。
SREM命令
SREM命令可以从集合中移除一个或多个元素:
SREM set element [element ...]
执行成功后返回被移除的元素数量
127.0.0.1:6379> SREM database "Redis"
(integer) 1
忽略不存在的元素
如果用户给定的元素不存在,那么SREM命令将忽略不存在的元素。
复杂度:
O
(
N
)
O(N)
O(N),其中
N
N
N为给定元素的数量。
版本要求:SREM命令从Redis 1.0.0版本开始可用,但是只有 Redis 2.4.0及以上版本支持一次移除多个元素。
SMOVE命令
SMOVE命令可以将指定的元素从源集合移动到目标集合:
SMOVE source target element
SMOVE命令执行成功后返回1,如果元素不存在,那么将返回0,表示执行失败。
127.0.0.1:6379> SMOVE database nosql "Redis"
(integer) 1
忽略不存在的元素
如果被移动的元素不存在,则SMOVE命令将放弃本次移动操作,并返回0表示操作失败。
覆盖已存在的元素
即使被移动的元素已经存在于目标集合中,SMOVE命令仍然会将指定元素移动到目标集合中,并覆盖目标集合中的相同元素。从结果上看,目标集合并没有改变,只是会导致被移动元素从源集合中消失。
复杂度:
O
(
1
)
O(1)
O(1)
版本要求:SMOVE命令从Redis 1.0.0开始可用。
SMEMBERS命令
使用SMEMBERS命令可以获取集合中的所有元素:
SMEMBERS set
127.0.0.1:6379> SMEMBERS database
1) "Redis"
2) "MySQL"
复杂度:
O
(
N
)
O(N)
O(N),其中
N
N
N为集合包含的元素数量。
版本要求:SMEMBERS命令从Redis 1.0.0版本开始可用。
SCARD命令
使用SCARD命令可以获取给定集合的大小,即集合中包含的元素数:
SCARD set
127.0.0.1:6379> SCARD database
(integer) 2
复杂度:
O
(
1
)
O(1)
O(1)
版本要求:SCARD命令从Redis 1.0.0版本开始可用。
SISMEMBER命令
SISMEMBER命令用于检查给定的元素是否存在于集合中:
SISMEMBER set element
如果存在则返回1,否则返回0
127.0.0.1:6379> SISMEMBER database "Redis"
(integer) 1
127.0.0.1:6379> SISMEMBER database "SQL Server"
(integer) 0
复杂度:
O
(
1
)
O(1)
O(1)
版本要求:SISMEMBER命令从Redis 1.0.0版本开始可用。
SRANDMEMBER命令
使用SRANDMEMBER命令,可以从集合中随机的获取指定数量的元素。SRANDMEMBER命令接受一个可选的 count 参数,用于指定想要获取的元素数量,如果用户没有给定这个参数,那么SRANDMEMBER命令默认只获取一个元素。
SRANDMEMBER set [count]
需要注意的一点是,被SRANDMEMBER命令返回的元素仍然存在于集合中,并没有被移除。
127.0.0.1:6379> SMEMBERS database
1) "Redis"
2) "MySQL"
3) "MongoDB"
4) "Oracle"
5) "PostgreSQL"
127.0.0.1:6379> SRANDMEMBER database
1) "MySQL"
返回指定数量的元素
通过可选参数 count,用户可以指定SRANDMEMBER命令返回的元素数量,其中 count 参数值既可以是正数,也可以是负数。
- 如果count参数的值为正数,那么SRANDMEMBER命令将返回count个不重复的元素。
127.0.0.1:6379> SRANDMEMBER database 2
1) "Redis"
2) "Oracle"
- 如果count参数的值大于集合包含的元素数量时,将返回集合的所有元素。
127.0.0.1:6379> SRANDMEMBER database 10
1) "Redis"
2) "MySQL"
3) "MongoDB"
4) "Oracle"
5) "PostgreSQL"
- 如果count参数的值为负数,那么SRANDMEMBER命令将随机返回count个元素,并且这些元素当中允许出现重复的元素:
127.0.0.1:6379> SRANDMEMBER database -3
1) "Redis"
2) "Oracle"
3) "Redis"
复杂度:
O
(
N
)
O(N)
O(N),其中
N
N
N为被返回的元素数量。
版本要求:不带count参数的SRANDMEMBER命令从Redis 1.0.0版本开始可用;带有count参数的SRANDMEMBER命令从Redis 2.6.0版本可用。
SPOP命令
使用SPOP命令,可以从集合中随机地移除指定数量的元素。SPOP命令接受一个可选参数count,用于指定需要被移除的元素个数。如果么有指定count参数,默认移除一个元素。
SPOP key [count]
SPOP命令会返回被移除元素作为返回值。
127.0.0.1:6379> SMEMBERS database
1) "Redis"
2) "MySQL"
3) "MongoDB"
4) "Oracle"
5) "PostgreSQL"
127.0.0.1:6379> SPOP database
"MySQL"
与SRANDMEMBER的区别
SPOP命令和SRANDMEMBER命令的主要区别在于:
- SPOP命令会移除被随机选中的元素,而SRANDMEMBER命令不会移除元素。
- SPOP命令只接受正数 count 值,如果给定负数count值将引发错误。
复杂度:
O
(
N
)
O(N)
O(N),其中
N
N
N为被移除的元素数量。
版本要求:不带count参数的SPOP命令从Redis 1.0.0版本开始可用;带有count参数的命令从Redis 3.2.0版本开始可用。
SINSERT、SINSERTSTORE命令
SINSERT命令用于计算给定的所有集合的交集,并返回这个交集的所有元素:
SINSERT set [set ...]
127.0.0.1:6379> SMEMBERS s1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> SMEMBERS s2
1) "c"
2) "d"
3) "e"
4) "f"
127.0.0.1:6379> SINSERT s1 s2
1) "c"
2) "d"
SINSERTSTORE命令可以把给定的集合的交集结算结果存储到指定的键里面:
SINSERTSTORE destination_key set [set ...]
127.0.0.1:6379> SINSERTSTORE s1-inner-s2 s1 s2
(integer) 2 --返回交集集合元素的数量
127.0.0.1:6379> SMEMBERS s1-inner-s2
1) "c"
2) "d"
复杂度:SINSERT命令和SINSERTSTORE命令的复杂度都是
O
(
N
∗
M
)
O(N*M)
O(N∗M),其中
N
N
N为给定的集合数量,而
M
M
M则是所有集合中,包含元素最少的那个集合的大小。
版本要求:SINSERT命令和SINSERTSTORE命令从Redis 1.0.0版本开始可用。
SUNION、SUNIONSTORE命令
使用SUNION命令可以用来计算给定的所有集合的并集,并返回并集的所有元素:
SUNION set [set ...]
127.0.0.1:6379> SUNION s1 s2
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
SUNIONSTORE命令可以将所有集合的并集结果,存储到指定的键中:
127.0.0.1:6379> SUNIONSTORE s1-union-s2 s1 s2
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
复杂度:SUNION命令和SUNIONSTORE命令的复杂度都是
O
(
N
)
O(N)
O(N),其中
N
N
N为所有集合包含的元素数量总和。
版本要求:SUNION命令和SUNIONSTORE命令从Redis 1.0.0版本开始可用。
SDIFF、SDIFFSTORE命令
SDIFF命令用于计算给定的所有集合的差集,并返回差集的所有元素:
SDIFF set [set ...]
127.0.0.1:6379> SDIFF s1 s2
1) "a"
2) "b"
SDIFFSTORE命令可以将差集计算结果存储到指定的键中:
127.0.0.1:6379> SDIFFSTORE s1-diff-s2 s1 s2
(integer) 2
127.0.0.1:6379> SMEMBERS s1-diff-s2
1) "a"
2) "b"
复杂度:SDIFF命令和SDIFFSTORE命令的复杂度都是
O
(
N
)
O(N)
O(N),其中
N
N
N为所有给定集合的元素数量总和。
版本要求:SDIFF命令和SDIFFSTORE命令从Redis 1.0.0版本开始可用。