Skip to content

set

Set 用于存放字符串的无序集合,并且每个元素是唯一的。他的添加、删除、查找操作的时间复杂度都是 O(1),即使集合非常大也能够很快完成。并且支持交集、并集、差集等运算。

基本命令

set 相关的命令就是增删改查以及集合操作。

增删改查

基本的 CRUD 操作:

  • SADD key member [member ...] -> int: 将新成员插入集合 key 中,已经位于其中的成员被隐式忽略,如果 key 不存在则会创建新集合并添加成员,返回真正添加到集合中的元素数量
  • SCARD key -> int: 返回集合的大小,如果键不存在返回 0
  • SMEMBERS key -> set[string]: 返回集合的所有成员
  • SMOVE source_key target_key member: 将成员从 source_key 移动到 target_key 中,成功移动返回 1(成功条件是 target_key 不包含该成员)
  • SPOP key [count] -> string|Array[string]|None: 从集合中删除并返回一个或 count 个成员,如果是空集合返回 null
  • SRANDMEMBER key [count] -> string|Array[string]|None: 从集合中返回一个或 count 个成员
  • SREM key member [member ...] -> int: 从集合中删除指定的成员,返回删除的成员数量
  • ``
Bash
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0

redis> SCARD myset
(integer) 2

redis> SMEMBERS myset
1) "Hello"
2) "World"

迭代

我们可以使用 SMEMBERS 命令来返回所有成员,但是如果成员数量非常多的时候这个会非常占用内存。而 SRANDMEMBER 会导致重复。如果在返回后不再需要可以使用 SPOP 来返回。如果还需要 redis 提供了 SSCAN 操作来实现迭代返回:

Bash
SSCAN key cursor [MATCH pattern] [COUNT count]

该命令能够实现增量迭代,每次调用都会返回 count 个成员,不会出现 SMEMBERS 这样调用时间过长阻塞服务器以及占用系统内存的情况。他的用法查看SCAN

成员检测

成员检测用于判断成员是否存在于集合中:

  • SISMEMBER key member -> int: 判断成员是否存在于集合中,0 表示不存在,1 表示存在
  • SMISMEMBER key member [member ...] -> Array[int]: 判断成员是否存在于集合中,返回判断的结果数组
Bash
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "notamember"
(integer) 0

redis> SMISMEMBER myset "one" "notamember"
1) (integer) 1
2) (integer) 0

集合操作

集合包括交集、并集和差集。每个操作包含两个版本,一个版本返回结果集合。一个版本(STORE)会将结果保存到指定的 key 来创建新的集合:

  • SUNION key [key...] -> set[string]: 返回两个或多个集合的所有成员(并集、合集)
  • SUNIONSTORE target_key key [key...] -> int: 求并集并保存到新的集合 target_key 中,返回 target_key 的成员数量
  • SINTER key [key...] -> set[string]: 返回两个或多个集合的共有成员(交集)
  • SINTER target_key key [key...] -> int: 求交集并保存到新的集合 target_key 中,返回 target_key 的成员数量
  • SDIFF key [key ...] -> set[]: 返回存在于第一个集合而不存在于后续集合的成员(差集)
  • SDIFFSTORE target_key key [key ...] -> int: 求差集并保存到新的集合 target_key 中,返回 target_key 的成员数量

参考