Bootstrap

Redis(05)Sorted Set类型--附有示例

sorted set

在Redis中,sorted set是一种有序的数据结构,其中每个成员都与一个分数相关联。这个分数用于对成员进行排序,因此sorted set实际上是一个由成员和分数组成的“有序表”。

在sorted set中,每个成员都是唯一的,但是分数可以重复。成员和分数都可以是任何字符串类型的值。

sorted set支持添加、删除、更新成员以及获取排名和成员的分数等操作,这些操作的时间复杂度均为O(logN),其中N为元素个数。此外,sorted set还支持基于分数范围或成员值范围的查询。

由于其有序特性和支持复杂查询的能力,sorted set在许多场景中都是非常有用的,例如排行榜、计数器、范围查询等。

常用的 sorted set 指令如下:

  1. ZADD key score member [score member ...]: 将一个或多个元素加入到有序集合中,并指定它们的分数。
  2. ZCARD key: 返回有序集合中元素的数量。
  3. ZCOUNT key min max: 返回有序集合中分数在[min, max]范围内的元素数量。
  4. ZINCRBY key increment member: 为有序集合中指定的元素增加分数。
  5. ZRANGE key start stop [WITHSCORES]: 返回有序集合中指定分数范围内的元素。如果带有 WITHSCORES 选项,则返回元素及其分数。
  6. ZRANK key member: 返回有序集合中指定元素的排名(从0开始)。
  7. ZREM key member [member ...]: 从有序集合中删除一个或多个元素。
  8. 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指令;如果需要获取有序集合中指定排名范围内的元素,可以使用ZRANGEZREVRANGE指令。

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

;