Redis 有序集合(Sorted Set)和集合(Set)的相同点是,都是 String 类型元素的集合,且都不允许出现重复元素。不同的是有序集合的每个元素都会关联一个 double 类型的分数,而 Redis 正是通过分数来为集合中的成员进行从小到大的排序。虽然有序集合的元素是唯一的,但是元素对应的分数(score)却是可以重复。
有序集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是 O(1)。集合中最大成员数为 2^32 - 1 (4294967295)个。
Redis 中有序集合(Sorted Set)的相关命令如下:
命令 | 说明 | 返回值 | 示例 |
---|---|---|---|
ZADD key score1 member1 [score2 member2] | 用于将一个或多个成员及其分数值加入到有序集合 key 中,如果某个成员已经是该有序集合的成员,则更新其分数值,并重新插入,以确保该成员在正确的位置上,分数值可以是整数值或双精度浮点数。如果指定的 key 不存在,则创建一个空的有序集合并执行 ZADD 操作,当 key 存在但不是有序集合类型时,返回一个错误 | 被成功添加的新成员的数量,不包括被更改的和已经存在的成员 | |
ZRANGE key start stop [WITHSCORES] | 用于返回有序集合中执行区间内的成员,其中成员的位置按照分数值从小到大排列,具有相同分数值的成员按照字典序来排列,下标 start 和 stop 都以 0 为底,即有序集合中的第一个成员的下标是 0,同时也可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员 | 返回指定区间内,带有分数值(可选)的有序集合内的成员列表 | |
ZRANGEBYSCORE key min max [WITHSCORES] | 用于返回有序集合中指定分数区间的成员列表,有序集合中成员按照分数值递增的顺序排列,具有相同分数值的成员按照字典序升序来排列。默认为闭区间[min, max] | 返回指定区间内,带有分数值(可选)的有序集合内的成员列表 | |
ZCARD key | 用于计算有序集合中的元素的数量 | 当 key 存在且是有序集合类型时,返回有序集合中元素的数量,当 key 不存在时,返回 0 | |
ZCOUNT key min max | 用于计算有序集合中执行分数区间的成员数量 | 返回分数值在 min 和 max 之间的成员数量,闭区间[min, max] | |
ZLEXCOUNT key min max | 用于计算有序集合中指定字典区间内的成员数量 | 返回指定字典区间内的成员数量 | |
ZRANGE BYLEX key min max [LIMIT offset count] | 用于通过字典区间返回有序集合的成员 | 返回指定区间内的元素列表 | |
ZRANK key member | 用于返回有序集合中指定成员的排名,也可以理解为索引,其中有序集合中成员按照分数递增顺序排列 | 返回指定成员 member 的索引(从 0 开始) | |
ZREVRANGE key start stop [WITHSCORES] | 与 ZRANGE 命令相似,用于返回有序集合中指定区间内的成员,其中成员的位置按照分数值递减来排列,具有相同分数值的成员,按照字典的升序排列 | 返回指定区间内带有分数值(可选)的有序集合成员列表 | |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 与 ZRANGEBYSCORE 命令相似,用于返回有序集合中指定分数区间的成员列表,有序集合中成员按照分数值递减的顺序排列,具有相同分数值的成员按照字典序逆序来排列。默认为闭区间[max, min] | 返回指定区间内带有分数值(可选)的有序集合成员列表 | |
ZREVRANK key member | 与 ZRANK 命令相似,用于返回有序集合中指定成员的排名,也可以理解为索引,其中有序集合中成员按照分数递减顺序排列 | 返回指定成员 member 的索引(从 0 开始) | |
ZSCORE key member | 返回有序集合中成员 member 的分数值 | 成员的分数值,以字符串形式表示,当 key 或者 member 不存在时,返回 nil | |
ZINTERSTORE distination numkeys key1 [key2 ...] | 用于计算给定的一个或多个有序集合的交集,其中给定 key1 的数量必须以 keynums 参数指定,并将该交集结果集存储到 destination 中。目标有序集合 destination 中某个成员的分数值是所有给定集合下的该成员分数值之和 | 保存到目标结果集中的成员的数量 | |
ZUNIONSTORE destination numkeys key1 [key2 ...] | 用于计算给定的一个或多个有序集合的交集,其中给定 key1 的数量必须以 keynums 参数指定,并将该交集结果集存储到 destination 中。目标有序集合 destination 中某个成员的分数值是所有给定集合下的该成员分数值之和 | 保存到目标结果集中的成员的数量 | |
ZINCRBY key increment member | 对有序集合中指定成员的分数加上指定的增量,增量可为负值 | member 成员的新的分数值,以字符串形式表示 | |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 用于迭代有序集合中的元素,包括元素成员和元素的分值 | 返回的每一个元素都是一个有序集合元素,由成员 member 和分值 score 组成 | |
ZREM key member [member ...] | 用于移除有序集合中的一个或多个成员,不存在的成员将被忽略。当 key 不存在或者不是有序集合类型时,返回一个错误 | 返回被成功移除的元素的数量,不包括被忽略的成员 | |
ZREMRANGEBYLEX key min max | 用于移除有序集合中给定的字典区间的所有成员 | 返回被成功移除的元素的数量,不包括被忽略的成员 | |
ZREMRANGEBYRANK key start stop | 用于移除有序集合中指定排名区间内的所有成员 | 返回被移除成员的数量 | |
ZREMRANGEBYSCORE key min max | 用于移除有序集合中指定分数区间内的所有成员 | 返回被移除成员的数量 | |
目前对于有关 LEX 的命令理解与官方文档有些出入,后期会专门写一篇关于这些命令的文章,同时由于 ZSCAN 命令是继承于 SCAN 命令的,此处也不再描述,后期会专门有一篇来说明 SCAN 命令的用法的。