Redis 集合(Set)命令
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
实例
1 | 127.0.0.1:6379> sadd set redis |
Redis Sadd 命令
将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。可用版本 >= 1.0.0
- 当集合 key 不是集合类型时,返回一个错误。
- 在Redis2.4版本以前, SADD 只接受单个成员值。
语法
sadd key value1... valuen
返回值
被添加到集合中的新元素的数量,不包括被忽略的元素。
srandmember key [count]
命令
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。该操作和spop
相似,但spop
将随机元素从集合中移除并返回,而 srandmember
则仅仅返回随机元素,而不对集合进行任何改动。可用版本 >= 1.0.0
从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
时间复杂度:
只提供 key 参数时为 O(1)。如果提供了 count 参数,那么为 O(N),N 为返回数组的元素个数。
返回值
只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 。如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
其他命令
命令 | 含义 | 可用版本 | 时间复杂度 |
---|---|---|---|
scard key | 返回集合 key 的基数(集合中元素的数量)。当 key 不存在时,返回 0 。 | >=1.0.0 | O(1) |
sdiff key [key...] | 返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的 key 被视为空集。差集的结果来自前面的 FIRST_KEY ,而不是后面的 OTHER_KEY1,也不是整个 FIRST_KEY OTHER_KEY1..OTHER_KEYN 的差集。 | >=1.0.0 | O(N), N 是所有给定集合的成员数量之和。 |
sdiffstore destination key [key...] | 这个命令的作用和sdiff 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。返回结果集中的元素数量。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。 | >=1.0.0 | O(N), N 是所有给定集合的成员数量之和。 |
sinter key [key ...] | 返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。 | >=1.0.0 | O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。 |
sinterstore destination key [key ...] | 这个命令的作用和sinter 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。返回结果集中的元素数量。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。 | >=1.0.0 | O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。 |
sismember key member | 判断 member 元素是否集合 key 的成员。如果 member 元素是集合的成员,返回 1 。如果 member 元素不是集合的成员,或 key 不存在,返回 0 。 | >= 1.0.0 | O(1) |
smembers key | 返回集合 key 中的所有成员。不存在的 key 被视为空集合。 | >= 1.0.0 | O(N),N 为集合的基数 |
smove source destination member | 将 member 元素从 source 集合移动到 destination 集合。原子性操作。如果 source 集合不存在或不包含指定的 member 元素,则 smove 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。 | >= 1.0.0 | O(1) |
spop key | 移除并返回集合中的一个随机元素。当 key 不存在或 key 是空集时,返回 nil 。如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 srandmember 命令。 | >= 1.0.0 | O(1) |
srem key member [member...] | 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。当 key 不是集合类型,返回一个错误。在 Redis 2.4 版本以前,srem 只接受单个 member 值。 | >= 1.0.0 | O(n),n为给定member元素的数量 |
sunion key [key ...] | 返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。 | >= 1.0.0 | O(N), N 是所有给定集合的成员数量之和。 |
sunionstore dest key [key ...] | 这个命令的作用和sinter 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。返回结果集中的元素数量。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。 | >=1.0.0 | O(N * M), N 是所有给定集合的成员数量之和。 |
sscan key cursor [MATCH pattern] [COUNT count] | 和 scan 、hscan 、zscan 一样,看不太明白。回头用到再看。 |
Redis 有序集合(sorted set)命令
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
实例
1 | 127.0.0.1:6379> zadd sset 1 redis |
zadd
命令
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
语法
zadd key score member [[score member] [score member] ...]
可用版本:
可用版本>= 1.2.0 。在 Redis 2.4 版本以前, zadd
每次只能添加一个元素。
时间复杂度:
O(M*log(N)),N 是有序集的基数,M 为成功添加的新成员的数量。
返回值:
被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
zrange
命令
返回有序集 key 中,指定区间内的成员。可用版本 >= 1.2.0
其中成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序(lexicographical order )来排列。
如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
语法
zrange key start stop [WITHSCORES]
说明
- 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
- 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
- 超出范围的下标并不会引起错误。比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
- 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
- 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。
- 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
时间复杂度
O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。
zrangebyscore
命令
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。可用版本 >= 1.0.5
语法
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
说明
具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。该选项自 Redis 2.0 版本起可用。
区间及无限
min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
举个例子:
1 | zrangebyscore zset (1 5 |
返回所有符合条件 1 < score <= 5 的成员,而
zrangebyscore zset (5 (10
则返回所有符合条件 5 < score < 10 的成员。
时间复杂度
O(log(N)+M), N 为有序集的基数, M 为被结果集的基数。
zremrangebyrank
命令
移除有序集 key 中,指定排名(rank)区间内的所有成员。返回被移除成员的数量。
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
语法
zremrangebyrank key start stop
时间复杂度
O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。
zremrangebyscore
命令
移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。返回被移除成员的数量。可用版本 >= 1.2.0
自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 zrangebyscore
命令。
语法
zremrangebyscore key min max
时间复杂度
O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。
zrevrange
命令
返回有序集 key 中,指定区间内的成员。可用版本 >= 1.2.0
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按 score 值递减的次序排列这一点外, zrevrange
命令的其他方面和zrange
命令一样。
语法
zrevrange key start stop [WITHSCORES]
时间复杂度
O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。
zunionstore
命令
计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。返回保存到 destination 的结果集的基数。可用版本 >= 2.0.0
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和 。
语法
zunionstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
WEIGHTS 选项
使用 WEIGHTS 选项,你可以为 每个给定有序集分别指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。
如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
AGGREGATE 选项
使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。
默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。
时间复杂度
O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数。
zinterstore
命令
计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。返回保存到 destination 的结果集的基数。可用版本 >= 2.0.0
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
关于 WEIGHTS 和 AGGREGATE 选项的描述,参见zinterstore
命令。
时间复杂度
O(NK)+O(Mlog(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。
其他命令
命令 | 含义 | 可用版本 | 时间复杂度 |
---|---|---|---|
zcard key | 返回有序集 key 的基数。当 key 存在且是有序集类型时,返回有序集的基数。当 key 不存在时,返回 0 。 | >=1.2.0 | O(1) |
zcount key min max | 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 | >=2.0.0 | O(log(N)+M), N 为有序集的基数, M 为值在 min 和 max 之间的元素的数量。 |
zincrby key increment member | 为有序集 key 的成员 member 的 score 值加上增量 increment 。可以通过传递一个负数值 increment ,让 score 减去相应的值。当 key 不存在,或 member 不是 key 的成员时, zincrby key increment member 等同于 zadd key increment member 。当 key 不是有序集类型时,返回一个错误。score 值可以是整数值或双精度浮点数。 | >=1.2.0 | O(log(N)) |
zrank key member | 返回有序集 key 中成员 member 的排名。如果 member 不是有序集 key 的成员,返回 nil 。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说, score 值最小的成员排名为 0 。 | >=2.0.0 | O(log(N)) |
zrem key member [member ...] | 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。f返回被成功移除的成员的数量,不包括被忽略的成员。当 key 存在但不是有序集类型时,返回一个错误。在 Redis 2.4 版本以前,zrem 每次只能删除一个元素。 | >=1.2.0 | O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量。 |
zrevrank key member | 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。排名以 0 为底,也就是说, score 值最大的成员排名为 0 。 | >=2.0.0 | O(log(N)) |
zscore key member | 返回有序集 key 中,成员 member 的 score 值,以字符串形式表示。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 | >=1.2.0 | O(1) |
zrevrangebyscore key max min [withscores] [limit offset count] | 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。除了成员按 score 值递减的次序排列这一点外,zrevrangebyscore 命令的其他方面和 zrangebyscore 命令一样。 | >=2.2.0 | O(log(N)+M), N 为有序集的基数, M 为结果集的基数。 |