集合(Set)

Redis 的集合键允许用户将任意多个各不相同的元素储存到集合里面,这些元素既可以是文本数据,也可以是二进制数据。虽然上一章介绍的列表键也允许我们储存多个元素,但是跟列表相比,集合有以下两个明显的区别:

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

  • 列表以有序方式储存元素,而集合则以无序方式储存元素。

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

  • 在执行像 LINSERTLREM 这样的列表命令时,即使命令只针对单个列表元素,程序有时候也不得不遍历整个列表以确定指定的元素是否存在,因此这些命令的复杂度都为 O(N) 。

  • 另一方面,对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以它们的复杂度都为 O(1) 。

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

作为例子,图 5-1 展示了一个名为 databases 的集合,这个集合里面包含了 "Redis""MongoDB""MySQL" 等八个元素。


图 5-1 集合示例 _images/IMAGE_SET_EXAMPLE.png


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

  • 将新元素添加到集合里面,或者从集合里面移除已有的元素。

  • 将指定的元素从一个集合移动到另一个集合。

  • 获取集合包含的所有元素。

  • 获取集合包含的元素数量。

  • 检查给定元素是否存在于集合。

  • 从集合里面随机地获取指定数量的元素。

  • 对多个集合执行交集、并集、差集计算。

本章接下来将对 Redis 集合键的各个命令进行介绍,并说明如何使用这些命令去解决各种实际存在的问题。