Redis学习手册4—数据结构之集合

集合简介

Redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中(类似于Java中的Set),这些数据既可以是文本数据,也可以是二进制数据。

集合与列表的区别

与上一章中介绍的列表键的区别如下所示:

  • 列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已经存在的元素添加到集合中将被忽略。
  • 列表以有序的方式存储元素,而集合以无序的方式存储元素。
  • 在执行像LINSERTLREM这样的列表命令时,即使命令只针对单个列表元素,程序有时也不得不遍历整个列表确定指定的元素是否存在,因此这些命令复杂度都为 O ( N ) O(N) O(N)
  • 对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以复杂度都为 O ( 1 ) O(1) O(1)

集合键的功能

Redis为集合键提供了一系列操作命令,通过使用这些命令,用户可以:

  • 将新元素添加到集合中,或者从集合中移除已有的元素;
  • 将指定元素从一个集合移动到另一个集合;
  • 获取集合包含的所有元素;
  • 获取集合中包含的元素数量;
  • 检查给定元素是否存在于集合中;
  • 从集合中随机地获取指定数量的元素;
  • 对多个集合执行交集、并集、差集计算;

集合命令速查表

命令用法及参数说明
SADDSADD set element [element ...]添加一个或多个元素到集合中
SREMSREM set element [element ...]从集合中移除一个或多个元素
SMOVESMOVE source target element将指定元素从源集合移动到目标集合
SMEMBERSSMEMBERS set获取集合中的所有元素
SCARDSCARD set获取给定集合的大小,即集合元素数
SISMEMBERSISMEMBER set element检查给定的元素是否存在于集合中
SRANDMEMBERSRANDMEMBER set [count]从集合中随机的获取指定数量的元素
SPOPSPOP key [count]随机的从集合中移除指定数量的元素
SINSERTSINSERT set [set ...]计算出给定的所有集合的交集
SINSEERSTORESINSERTSTORE destination set [set ...]计算交集并将交集存储到目标集合中
SUNIONSUNION set [set ...]计算给定所有集合的并集
SUNIONSTORESUNIONSTORE destination_key set [set ...]计算所有集合的并集,并将并集存储到指定的键中
SDIFFSDIFF set [set ...]计算给定所有集合的差集
SDIFFSTORESDIFFSTORE 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(NM),其中 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版本开始可用。

上一篇:Redis学习手册3—数据结构之列表

下一篇:Redis学习手册5—数据结构hi有序列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值