set
Set 用于存放字符串的无序集合,并且每个元素是唯一的。他的添加、删除、查找操作的时间复杂度都是 O(1)
,即使集合非常大也能够很快完成。并且支持交集、并集、差集等运算。
基本命令
set 相关的命令就是增删改查以及集合操作。
增删改查
基本的 CRUD 操作:
SADD key member [member ...] -> int
: 将新成员插入集合 key 中,已经位于其中的成员被隐式忽略,如果 key 不存在则会创建新集合并添加成员,返回真正添加到集合中的元素数量SCARD key -> int
: 返回集合的大小,如果键不存在返回 0SMEMBERS key -> set[string]
: 返回集合的所有成员SMOVE source_key target_key member
: 将成员从 source_key 移动到 target_key 中,成功移动返回 1(成功条件是 target_key 不包含该成员)SPOP key [count] -> string|Array[string]|None
: 从集合中删除并返回一个或 count 个成员,如果是空集合返回 nullSRANDMEMBER 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
操作来实现迭代返回:
该命令能够实现增量迭代,每次调用都会返回 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 的成员数量