Redis 基础 -- 集合 Set 类型 和 Set 类型的常用命令

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 基础 -- 集合 Set 类型 和 Set 类型的常用命令相关的知识,希望对你有一定的参考价值。

文章目录

1.集合

Redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据。集合与列表有以下两个明显的区别:

  • 列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已存在的元素添加到集合将被忽略。
  • 列表以有序方式存储元素,而集合则以无序方式存储元素。

这两个区别带来的差异主要跟命令的复杂度有关:

  • 在执行像LINSERT和LREM这样的列表命令时,即使命令只针对单个列表元素,程序有时也不得不遍历整个列表以确定指定的元素是否存在,因此这些命令的复杂度都为O(N)。
  • 对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以复杂度都为O(1)。

因此当我们需要存储多个元素时,就可以考虑这些元素是否可以以无序的方式存储,并且是否不会出现重复,如果是,那么就可以使用集合来存储这些元素,从而有效地利用集合操作的效率优势。


1.1 SADD:将元素添加到集合

通过使用SADD命令,用户可以将一个或多个元素添加到集合中。

语法:


这个命令会返回成功添加的新元素数量作为返回值。

示例:

以下代码展示了如何使用SADD命令去构建一个databases集合:

因为集合不存储相同的元素,所以用户在使用SADD命令向集合中添加元素的时候,SADD命令会自动忽略已存在的元素,只将不存在于集合的新元素添加到集合中。

说明:

复杂度:O(N),其中N为用户给定的元素数量。


1.2 SREM:从集合中移除元素

通过使用SREM命令,用户可以从集合中移除一个或多个已存在的元素。

语法:


这个命令会返回被移除的元素数量。

示例:


说明:

复杂度:O(N),其中N为用户给定的元素数量。


1.3 SMOVE:将元素从一个集合移动到另一个集合

SMOVE命令允许用户将指定的元素从源集合移动到目标集合。

语法:


SMOVE命令在移动操作成功执行时返回1。如果指定的元素并不存在于源集合,那么SMOVE命令将返回0,表示移动操作执行失败。

示例:

现在有2个集合numSet1和numSet2。

把numSet1的元素3移动到numSet2:


如果用户想要移动的元素并不存在于源集合,那么SMOVE将放弃执行移动操作,并返回0表示移动操作执行失败。

即使用户想要移动的元素已经存在于目标集合,SMOVE命令仍然会将指定的元素从源集合移动到目标集合,并覆盖目标集合中的相同元素。从结果来看,这种移动不会改变目标集合包含的元素,只会导致被移动的元素从源集合中消失。

说明:

复杂度:O(1)。


1.4 SMEMBERS:获取集合包含的所有元素

通过使用SMEMBERS命令,用户可以取得集合包含的所有元素。

语法:

示例:

我们在使用SMEMBERS命令以及集合的时候,不应该对集合元素的排列顺序做任何假设。如果有需要,我们可以在客户端对SMEMBERS命令返回的元素进行排序,或者直接使用Redis提供的有序结构(比如列表和有序集合)

说明:

复杂度:O(N),其中N为集合包含的元素数量。


1.5 SCARD:获取集合包含的元素数量

通过使用SCARD命令,用户可以获取给定集合的大小,即集合包含的元素数量。

语法:

示例:

说明:

复杂度:O(1)。


1.6 SISMEMBER:检查给定元素是否存在于集合

通过使用SISMEMBER命令,用户可以检查给定的元素是否存在于集合当中。

语法:


SISMEMBER命令返回1表示给定的元素存在于集合当中;返回0则表示给定元素不存在于集合当中。

示例:

说明:

复杂度:O(1)。


1.7 SRANDMEMBER:随机获取集合中的元素

通过使用SRANDMEMBER命令,用户可以从集合中随机地获取指定数量的元素。

SRANDMEMBER命令接受一个可选的count参数,用于指定用户想要获取的元素数量,如果用户没有给定这个参数,那么SRANDMEMBER命令默认只获取一个元素。

语法:


需要注意的一点是,被SRANDMEMBER命令返回的元素仍然会存在于集合当中,它们不会被移除。

示例:


如果count参数的值为负数,那么SRANDMEMBER命令将随机返回count的绝对值个元素,并且在这些元素当中允许出现重复的元素。

因为count参数为负数的SRANDMEMBER命令允许返回重复元素,所以即使count的绝对值大于集合包含的元素数量,SRANDMEMBER命令也会按照要求返回count的绝对值个元素:

说明:

复杂度:O(N),其中N为被返回的元素数量。


1.8 SPOP:随机地从集合中移除指定数量的元素

通过使用SPOP命令,用户可以从集合中随机地移除指定数量的元素。SPOP命令接受一个可选的count参数,用于指定需要被移除的元素数量。如果用户没有给定这个参数,那么SPOP命令默认只移除一个元素。

语法:


SPOP命令会返回被移除的元素作为命令的返回值。

示例:


1.8.1 SPOP与SRANDMEMBER的区别

SPOP命令和SRANDMEMBER命令的主要区别在于,SPOP命令会移除被随机选中的元素,而SRANDMEMBER命令则不会移除被随机选中的元素。

SPOP命令与SRANDMEMBER命令的另一个不同点在于,SPOP命令只接受正数count值,如果向SPOP命令提供负数count值将引发错误,因为负数count值对于SPOP命令是没有意义的。


1.8.2 说明

复杂度:O(N),其中N为被移除的元素数量。


1.9 SINTER、SINTERSTORE:对集合执行交集计算


1.9.1 SINTER 命令

SINTER命令可以计算出用户给定的所有集合的交集,然后返回这个交集包含的所有元素。

语法:

示例:


1.9.2 SINTERSTORE 命令

除了SINTER命令之外,Redis还提供了SINTERSTORE命令,这个命令可以把给定集合的交集计算结果存储到指定的键里面。

语法:


如果给定的键已经存在,那么SINTERSTORE命令在执行存储操作之前会先删除已有的键。

SINTERSTORE命令在执行完毕之后会返回被存储的交集元素数量作为返回值。

示例:

通过执行以下命令,我们可以把s1和s2的交集计算结果存储到集合s1-inter-s2中:


1.9.3 SINTER、SINTERSTORE 时间复杂度说明

复杂度:SINTER命令和SINTERSTORE命令的复杂度都是O(N*M),其中N为给定集合的数量,而M则是所有给定集合当中,包含元素最少的那个集合的大小。


1.10 SUNION、SUNIONSTORE:对集合执行并集计算


1.10.1 SUNION 命令

SUNION命令可以计算出用户给定的所有集合的并集,然后返回这个并集包含的所有元素。

语法:

示例:


1.10.2 SUNIONSTORE 命令

与SINTERSTORE命令类似,Redis也为SUNION提供了相应的SUNIONSTORE命令,这个命令可以把给定集合的并集计算结果存储到指定的键中,并在键已经存在的情况下自动覆盖已有的键。

语法:

示例:


1.10.3 SUNION、SUNIONSTORE 时间复杂度说明

复杂度:SUNION命令和SUNIONSTORE命令的复杂度都是O(N),其中N为所有给定集合包含的元素数量总和。


1.11 SDIFF、SDIFFSTORE:对集合执行差集计算


1.11.1 SDIFF 命令

SDIFF命令可以计算出给定集合之间的差集,并返回差集包含的所有元素。

语法:

SDIFF命令会按照用户给定集合的顺序,从左到右依次地对给定的集合执行差集计算。

示例:


SDIFF命令首先会对集合s1和集合s2执行差集计算,然后使用这个临时集合与集合s3执行差集计算。


1.11.2 SDIFFSTORE 命令

与SINTERSTORE命令和SUNIONSTORE命令一样,Redis也为SDIFF命令提供了相应的SDIFFSTORE命令,这个命令可以把给定集合之间的差集计算结果存储到指定的键中,并在键已经存在的情况下自动覆盖已有的键。

语法:

示例:


1.11.3 SDIFF、SDIFFSTORE 时间复杂度说明

复杂度:SDIFF命令和SDIFFSTORE命令的复杂度都是O(N),其中N为所有给定集合包含的元素数量总和。


1.12 执行集合计算的注意事项

因为对集合执行交集、并集、差集等集合计算需要耗费大量的资源,所以用户应该尽量使用SINTERSTORE等命令来存储并重用计算结果,而不要每次都重复进行计算。

此外,当集合计算涉及的元素数量非常大时,Redis服务器在进行计算时可能会被阻塞。这时,我们可以考虑使用Redis的复制功能,通过从服务器来执行集合计算任务,从而确保主服务器可以继续处理其他客户端发送的命令请求。


1.13 重点回顾

  • 集合允许用户存储任意多个各不相同的元素。
  • 所有针对单个元素的集合操作,复杂度都为O(1)。
  • 在使用SADD命令向集合中添加元素时,已存在于集合中的元素会自动被忽略。
  • 因为集合以无序的方式存储元素,所以两个包含相同元素的集合在使用SMEMBERS命令时可能会得到不同的结果。
  • SRANDMEMBER命令不会移除被随机选中的元素,而SPOP命令的做法正相反。
  • 因为集合计算需要使用大量的计算资源,所以我们应该尽量存储并重用集合计算的结果,在有需要的情况下,还可以把集合计算放到从服务器中进行。


以上是关于Redis 基础 -- 集合 Set 类型 和 Set 类型的常用命令的主要内容,如果未能解决你的问题,请参考以下文章

Redis-Redis的常用数据类型之Set集合

Redis学习-sorted set数据类型

python基础:基本数据类型四(set集合)基础数据类型补充深浅拷贝

Redis学习基础二

Redis01_概述安装keyStringList列表Set集合Hash哈希Zset有序集合配置文件详解

Redis