sorted set
在Redis中,sorted set是一种有序的数据结构,其中每个成员都与一个分数相关联。这个分数用于对成员进行排序,因此sorted set实际上是一个由成员和分数组成的“有序表”。
在sorted set中,每个成员都是唯一的,但是分数可以重复。成员和分数都可以是任何字符串类型的值。
sorted set支持添加、删除、更新成员以及获取排名和成员的分数等操作,这些操作的时间复杂度均为O(logN),其中N为元素个数。此外,sorted set还支持基于分数范围或成员值范围的查询。
由于其有序特性和支持复杂查询的能力,sorted set在许多场景中都是非常有用的,例如排行榜、计数器、范围查询等。
常用的 sorted set 指令如下:
ZADD key score member [score member ...]
: 将一个或多个元素加入到有序集合中,并指定它们的分数。ZCARD key
: 返回有序集合中元素的数量。ZCOUNT key min max
: 返回有序集合中分数在[min, max]范围内的元素数量。ZINCRBY key increment member
: 为有序集合中指定的元素增加分数。ZRANGE key start stop [WITHSCORES]
: 返回有序集合中指定分数范围内的元素。如果带有 WITHSCORES 选项,则返回元素及其分数。ZRANK key member
: 返回有序集合中指定元素的排名(从0开始)。ZREM key member [member ...]
: 从有序集合中删除一个或多个元素。ZSCORE key member
: 返回有序集合中指定元素的分数。
除此之外,还有一些其他的使用场景较少的指令,可以通过 Redis 的官方文档进行了解。
ZADD
ZADD
是Redis中用来添加元素到有序集合中的命令。其语法如下:
ZADD key score member [score member ...]
其中,key
表示有序集合的名称,score
表示添加的元素的分数,member
则表示添加的元素。
示例:
假设我们要创建一个有序集合,用于存储学生成绩(姓名作为成员,分数作为分数值),可以使用如下命令:
ZADD scores 95 Alice 85 Bob 75 Charlie 90 Dave
该命令将会创建名称为scores
的有序集合,其中有4个元素,分别为“Alice”、“Bob”、“Charlie”和“Dave”,对应的分数分别为95、85、75和90。如果有同名成员,则新加入的成员的分数值将会覆盖原有成员的分数值。
ZCARD
好的,让我进一步解释一下。
ZCARD
命令是用于获取Redis中有序集合(sorted set)中的元素数量的。有序集合与普通集合不同之处在于,元素在有序集合中是带有权重(score)的,这样可以通过权重来排序元素,并且支持范围查询。
例如,我们可以用一个有序集合来存储学生成绩,学生成绩就是有序集合中的成员,成绩分数就是有序集合成员的权重。使用ZADD
命令向有序集合中添加元素,使用ZCARD
命令获取有序集合中元素的数量。
举个例子,如果我们添加了5个学生的成绩到一个名为scores
的有序集合中,那么我们可以使用如下命令:
ZADD scores 80 Tom
ZADD scores 90 John
ZADD scores 75 Anna
ZADD scores 87 Emily
ZADD scores 95 Peter
其中,每一行的第一个参数是集合名称scores
,第二个参数是该成员(学生)的成绩(权重),第三个参数是该成员(学生)的名字。这样,我们就向有序集合中添加了5个元素。
使用以下命令可以获取有序集合中元素的数量:
ZCARD scores
执行该命令后,Redis将返回集合scores
中的元素数量,输出结果为5
,即元素数量为5。
ZCARD
指令主要用于有序集合的元素数量的查询,通常在以下场景中被使用:
-
统计排行榜中的元素数量:在游戏中,经常会使用有序集合来存储玩家的积分排行榜,
ZCARD
指令可以用来查询排行榜中的玩家数量。 -
判断元素是否存在:在Redis中,集合和有序集合都是支持快速判断元素是否存在的,使用
ZCARD
指令可以判断有序集合中是否存在某个元素。 -
监控变化:当有新元素被加入或移出有序集合时,可以使用
ZCARD
指令来获取当前有序集合中元素的数量,判断集合中元素数量的变化情况。
总的来说,ZCARD
指令主要用在统计、监控和查询元素数量的场景中。如果需要获取有序集合中指定权重(成绩)范围内的元素,还可以使用ZCOUNT
指令;如果需要获取有序集合中指定排名范围内的元素,可以使用ZRANGE
和ZREVRANGE
指令。
ZCOUNT
ZCOUNT
指令用于获取有序集合中指定权重(成绩)范围内的元素数量。有序集合中的元素是按照权重(成绩)值有序排列的。该指令主要有以下几种使用场景:
-
统计指定范围的元素数量:在某些场景下,需要获取有序集合中一定区间内的元素数量,例如要求得分数在85分~90分之间的学生人数,可以使用
ZCOUNT
指令来统计。 -
计算集合的基数:当需要得到有序集合中元素个数时,可以使用
ZCARD
指令来获取。但如果只需要求得指定权重范围内的元素数量,则使用ZCOUNT
指令可以更加高效。 -
动态查询数据:由于Redis支持动态地添加、删除、修改有序集合中的元素,因此如果需要对有序集合中元素的动态变化进行实时分析,则可以使用
ZCOUNT
指令进行动态查询。
举个例子,如果我们要查询有序集合scores
中得分数在85分~90分之间的学生人数,可以使用以下命令:
ZCOUNT scores 85 90
其中,第一个参数是有序集合scores
的名字,第二个和第三个参数是查询的得分数区间范围,表示查询得分数大于等于85且小于等于90的学生人数。
执行该命令后,Redis将返回有序集合scores
中得分数在85分~90分之间的学生人数,输出结果为查询到的数量。
我再举个例子来说明。假设有一家公司,需要按照员工工资的高低来维护一个工资排行榜。
首先,我们可以用ZADD
指令向有序集合salary_rank
中添加员工的工资信息。例如,将员工A的工资设置为9000元:
ZADD salary_rank 9000 A
然后,我们可以继续向该有序集合中添加其他员工的工资信息。例如,将员工B的工资设置为12000元:
ZADD salary_rank 12000 B
接下来,我们可以使用ZCOUNT
指令来获取工资在某个范围内的员工数量。例如,要查询工资在9000元~12000元之间的员工数量,可以使用以下命令:
ZCOUNT salary_rank 9000 12000
执行该命令后,Redis会返回工资在9000元~12000元之间的员工数量。比如,如果有3名员工的工资在该范围内,那么Redis将返回3。
ZINCRBY
ZINCRBY
指令用于给有序集合中的某个元素增加指定数量的权重(分数)。该指令主要用于有序集合中某个元素的分数计数,例如在一个统计网站访问量的程序中每当有人访问该网站时,可以使用ZINCRBY
指令增加有序集合中该网站的访问量。
举个例子,如果我们要给有序集合scores
中的学生小明增加5分的成绩,可以使用以下命令:
ZINCRBY scores 5 "小明"
其中,第一个参数是有序集合scores
的名字,第二个参数是增加的分数值,第三个参数是需要增加分数的元素,即学生“小明”。
执行该命令后,Redis将返回小明增加5分后的最终成绩。
注意:如果小明在scores
有序集合中不存在,那么Redis会先将小明添加到集合中,并将分数设置为增加的分数值。
ZRANGE
ZRANGE
指令用于获取有序集合中排名在指定范围内的元素列表。该指令通过指定一个起始排名和一个终止排名,可以获取有序集合中排名在该范围内的所有元素。
举个例子,如果我们有一个有序集合scores
,其中保存了学生成绩信息,我们可以使用ZRANGE
指令获取成绩排名前10的学生名称和成绩,命令如下:
ZRANGE scores 0 9 WITHSCORES
其中,第一个参数是有序集合scores
的名字,第二个参数是起始排名,第三个参数是终止排名,WITHSCORES
表示希望在返回结果中同时包括元素的权重(成绩)。
如果执行成功,Redis将返回成绩排名前10的学生名称和成绩,例如:
1) "小明"
2) "95"
3) "小红"
4) "92"
5) "小刚"
6) "89"
...
上述结果中,每个学生的名称和成绩都是成对出现的,名称在前,成绩在后,这是由于我们在指令中指定了WITHSCORES
参数。
ZRANK
ZRANK
指令用于获取有序集合中指定元素的排名。该指令会返回指定元素在有序集合中的排名,排名从0开始,即排名为0表示该元素在有序集合中的排名最高。
举个例子,如果我们有一个有序集合scores
,其中保存了学生成绩信息,我们可以使用ZRANK
指令获取学生“小明”的成绩排名,命令如下:
ZRANK scores "小明"
其中,第一个参数是有序集合scores
的名字,第二个参数是要查询排名的元素,即学生名称“小明”。
如果执行成功,Redis将返回学生“小明”的排名。如下:
4
上述结果表示,学生“小明”在有序集合scores
中排名第5(排名从0开始)。
需要注意的是,如果有序集合中不存在查询的元素,指令将返回空值nil
。
ZREM
ZREM
指令用于从有序集合中删除一个或多个元素。该指令可以同时删除有序集合中的多个元素,如果指定的元素中有不存在于有序集合中的元素,Redis会忽略这些元素的删除操作。
举个例子,如果我们有一个有序集合scores
,其中保存了学生成绩信息,我们可以使用ZREM
指令删除多个学生的成绩信息,命令如下:
ZREM scores "小明" "小红" "小刚"
其中,第一个参数是有序集合scores
的名字,后续的参数是要删除的元素,即学生名称。
如果执行成功,Redis将返回被删除元素的数量。
需要注意的是,除了可以同时删除多个元素外,ZREM
指令还可以删除单个元素,只需要将元素名称作为第二个参数传入,如下所示:
ZREM scores "小明"
ZSCORE
ZSCORE
指令用于获取有序集合中指定元素的分数值。该指令会返回指定元素的分数值,如果指定的元素不存在于有序集合中,Redis会返回空值 nil
。
举个例子,如果我们有一个有序集合scores
,其中保存了学生成绩信息,我们可以使用ZSCORE
指令获取学生“小明”的成绩,命令如下:
ZSCORE scores "小明"
其中,第一个参数是有序集合scores
的名字,第二个参数是要查询分数的元素,即学生名称“小明”。
如果执行成功,Redis将返回学生“小明”的成绩分数。
需要注意的是,如果有序集合中不存在查询的元素,指令将返回空值nil
。