Redis学习-Set
在Redis中,Set类型是没有排序的字符集合,和List类型一样,可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。和List类型不同的是,Set集合中不允许出现重复的元素。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
基本操作
命令 |
描述 |
复杂度 |
返回值 |
SADD key [member ...]
|
将一个或多个member元素加入到集合 key 当中,已经存在于集合的member元素将被忽略。假如key不存在,则创建一个只包含 member元素作成员的集合。当key不是集合类型时,返回一个错误。 |
O(N), N 是被添加的元素的数量。 |
被添加到集合中的新元素的数量,不包括被忽略的元素。 |
SCARD key |
返回集合 key 的基数(集合中元素的数量)。 |
O(1) |
集合的基数。key不存在时,返回 0 。 |
SDIFF key [key ...] |
返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的key被视为空集。 |
O(N),N是所有集合的成员数量之和。 |
一个包含差集成员的列表。 |
SDIFFSTORE destination key [key ...] |
作用和SDIFF类似,但它将结果保存到 destination.而不是简单地返回结果集.如果destination集合已经存在,则将其覆盖。destination可以是key本身。 |
O(N),N 是所有给定集合的成员数量之和。 |
结果集中的元素数量。 |
SINTER key [key ...] |
返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的key被视为空集。当给定集合当中有一个空集时,结果也为空集 |
O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。 |
交集成员的列表。 |
SINTERSTORE destination key [key ...] |
类似SINTER命令,但它将结果保存到destination 集合,而不是简单地返回结果集。如果destination 集合已经存在,则将其覆盖。destination可以是 key本身。 |
O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。 |
结果集中的成员数量。 |
SISMEMBER key member |
判断 member 元素是否集合 key 的成员。 |
O(1) |
是1 ;不是或 key不存在返回0 。 |
SMEMBERS key |
返回集合 key 中的所有成员。不存在的 key 被视为空集合。 |
O(N), N为集合的基数。 |
集合中的所有成员。 |
SMOVE source destination member |
将member元素从source移动到destination.SMOVE 是原子性操作。如果source不存在或不包含指定的member元素,则SMOVE命令不执行任何操作,仅返回0 。否则, member元素从 source 集合中被移除,并添加到 destination 集合中去。当 destination 集合已经包含 member 元素时, SMOVE命令只是简单地将 source 集合中的 member 元素删除。当 source或 destination 不是集合类型时,返回一个错误。 |
O(1) |
如果member元素被成功移除,返回 1 。如果 member元素不是source 集合的成员,并且没有任何操作对 destination集合执行,那么返回 0 。 |
SPOP key |
移除并返回集合中的一个随机元素。如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。 |
O(1) |
被移除的随机元素。当 key不存在或key是空集时,返回nil 。 |
SREM key member [member ...] |
移除集合 key中的一个或多个 member元素,不存在的 member元素会被忽略。当key不是集合类型,返回一个错误。 |
O(N), N 为给定 member 元素的数量。 |
被成功移除的元素的数量,不包括被忽略的元素。 |
SUNION key [key ...] |
返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。 |
O(N), N是所有集合的成员数量之和。 |
O(N), N 是所有给定集合的成员数量之和。 |
SUNIONSTORE destination key [key ...] |
类似于 SUNION 命令,但它将结果保存到 destination集合,而不是简单地返回结果集。 |
O(N), N 是所有给定集合的成员数量之和。 |
结果集中的元素数量。 |
应用范围
- 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
- 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。