通过TairZset(exZset)可实现256维度的double类型的分值排序,适用于游戏、直播、音乐、电商等行业的排行榜场景,可极大提升数据处理效率,且客户端适配简易,无需任何编解码封装。
TairZset简介
原生Redis支持的排序结构Sorted Set(也称Zset)只支持1个double类型的分值排序,实现多维度排序时较为困难。例如通过IEEE 754结合拼接的方式实现多维度排序,此类方式存在实现复杂、精度下降、EXZINCRBY命令无法使用等局限性。
借助阿里云自研的TairZset数据结构,可帮助您轻松实现多维度排序能力,相较于传统方案具有如下优势:
最大支持256维的double类型的分值排序(排序优先级为从左往右)。
对于多维score而言,左边的score优先级大于右边的score,以一个三维score为例:score1#score2#score3,TairZset在比较时,会先比较score1,只有score1相等时才会比较score2,否则就以score1的比较结果作为整个score的比较结果。同样,只有当score2相等时才会比较score3。若所有维度分数都相同,则会按照元素顺序(ascii顺序)进行排序。
为了方便理解,可以把#想象成小数点(.),例如0#99、99#90和99#99大小关系可以理解为0.99 < 99.90 < 99.99,即0#99 < 99#90 < 99#99。
支持EXZINCRBY命令,不再需要取回当前数据,在本地增加值后再拼接写回Tair。
支持和原生Zset相似的API。
提供 普通排行榜 和 分布式架构排行榜 的能力。
提供开源TairJedis客户端,无需任何编解码封装,您也可以参考开源自行实现封装其他语言版本。
典型场景
适用于游戏、直播、音乐、电商等行业的排行榜场景,例如:
直播排行榜:直播PK中,主播之间先按照当前人气值排序;如果人气值相同,再按照点赞数排序;如果点赞数也相同,再按照礼物金额进行排序等。
奖牌排行榜:从金、银、铜牌的维度对参赛方进行排名,先按照金牌数量排序;如果金牌数量一致,再以银牌数量排序;如果银牌数量也一致,再按照铜牌数量排序。
游戏排行榜:玩家之间按照得分、任务完成时长、段位等多个维度进行排名。
该Module已开源,更多信息请参见TairZset。
最佳实践
前提条件
注意事项
操作对象为Tair实例中的TairZset数据。
命令列表
命令 | 语法 | 说明 |
| 将指定的分数与成员信息存储到TairZset结构的Key中,支持指定多个分数与成员。 说明 如需实现多维度的排序,各维度的分数之间使用井号(#)分隔,例如 | |
| 为Key(TairZset数据结构)中的成员增加分数,increment为要增加的分数值。 | |
| 返回存储在Key(TairZset数据结构)中成员的分数,如果Key或Key中的成员不存在,系统会返回nil。 | |
| 返回存储在Key(TairZset数据结构)中指定范围的元素。 | |
| 返回存储在Key(TairZset数据结构)中指定范围内的元素,元素按分值从高到低的顺序排列,按字典序降序排列分数相同的元素。 说明 除排序方式相反外,本命令和EXZRANGE用法相似。 | |
| 返回存储在Key(TairZset数据结构)中,分数大于等于min且小于等于max值的所有元素,返回元素按分数从低到高排列,分数相同的元素按照字典顺序返回。 | |
| 返回存储在Key(TairZset数据结构)中,分数大于等于min且小于等于max值的所有元素。和TairZset中元素默认排序相反,该命令返回元素按照分数从高到低排列,分数相同的元素按照逆字典序排列。 说明 除排序方式相反外,本命令和EXZRANGEBYSCORE用法相似,注意本命令中max在前。 | |
| 为确保元素按照字典序排列,当Key中所有元素分数相同时,则该命令返回存储在Key中介于min和max值之间的元素。 | |
| 为确保元素按照字典序排列,当Key中所有元素分数相同时,则该命令返回存储在Key中介于max和min之间的元素。 说明 除排序方式相反外,本命令和EXZRANGEBYLEX用法相同,注意本命令中max在前。 | |
| 移除存储Key中的指定成员,如果指定成员不存在,则忽略。 | |
| 移除存储在Key(TairZset数据结构)中,分数大于等于min且小于等于max值的元素。 | |
| 移除存储在Key(TairZset数据结构)中,级别介于start和stop之间的元素。 | |
| 为确保元素按照字典序排列,当Key中所有元素分数相同时,则该命令移除存储在Key中介于max和min之间的元素。 说明 若使用相同的min和max参数值执行该命令和EXZRANGEBYLEX命令,则该命令移除的元素与EXZRANGEBYLEX命令返回的元素相同。 | |
| 返回存储在Key(TairZset数据结构)中的基数(即元素的个数)。 | |
| 返回存储在Key(TairZset数据结构)中的成员的级别,按照分数由低到高排列。 级别(或索引)从0开始计数,即分数最低的成员的级别为0。 | |
| 返回存储在Key(TairZset数据结构)中的成员的级别。返回结果按照分数从高到低排列。 级别(或索引)从0开始计数,即分数最高的成员的级别为0。 说明 除排序规则相反外,本命令和EXZRANK用法类似。 | |
| 返回存储在Key(TairZset数据结构)中,分数介于min和max之间的元素的个数。 | |
| 为确保元素按照字典序排列,若Key中所有元素分数相同,则该命令返回存储在Key,值介于min和max之间的元素的数量。 | |
| 计算指定的分数在Key(TairZset数据结构)中按照分数从低到高排序的排名位置。级别(或索引)从0开始计数,即分数最低的成员的级别为0。 说明 若指定的分数不存在,则返回该分数在Key(TairZset数据结构)中的预计排名;若指定的分数已存在,Tair会默认将指定的分数排在已存在的分数之前。 | |
| 计算指定的分数在Key(TairZset数据结构)中按照分数从高到低排序的排名位置。级别(或索引)从0开始计数,即分数最高的成员的级别为0。 说明 若指定的分数不存在,则返回该分数在Key(TairZset数据结构)中的预计排名;若指定的分数已存在,Tair会默认将指定的分数排在已存在的分数之后。 | |
| 使用原生Redis的DEL命令可以删除一条或多条TairZset数据。 |
本文的命令语法定义如下:
大写关键字
:命令关键字。斜体
:变量。[options]
:可选参数,不在括号中的参数为必选。A|B
:该组参数互斥,请进行二选一或多选一。...
:前面的内容可重复。
EXZADD
类别 | 说明 |
语法 |
|
时间复杂度 | O(N) |
命令描述 | 将指定的分数与成员信息存储到TairZset结构的Key中,支持指定多个分数与成员,系统会根据Key和成员是否存在,执行不同的策略: 说明 如需实现多维度的排序,各维度的分数之间使用井号(#)分隔,例如
|
选项 |
|
返回值 | 返回值为整数数字,具体为:
|
示例 | 命令示例:
返回示例:
|
EXZINCRBY
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)) |
命令描述 | 为Key(TairZset数据结构)中的成员增加分数,increment为要增加的分数值,系统会根据Key和成员是否存在,执行不同的策略:
说明
|
选项 | 无 |
返回值 | 返回成员的新分数(字符串形式),如果使用了多维度分数,则该成员分数的格式为 |
示例 | 命令示例:
返回示例:
|
EXZSCORE
类别 | 说明 |
语法 |
|
时间复杂度 | O(1) |
命令描述 | 返回存储在Key(TairZset数据结构)中成员的分数,如果Key或Key中的成员不存在,系统会返回nil。 |
选项 | 无 |
返回值 | 返回成员的分数(字符串形式),如果使用了多维度分数,则该成员分数的格式为 |
示例 | 命令示例:
返回示例:
|
EXZRANGE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N表示TairZset中元素的数量,M表示返回的元素的数量。 |
命令描述 | 返回存储在Key(TairZset数据结构)中指定范围的元素。 |
选项 |
|
返回值 | 返回指定范围内元素的列表,如果使用了WITHSCORES选项,则返回结果中包含元素的分数。 |
示例 | 命令示例:
返回示例:
|
EXZREVRANGE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N表示TairZset中元素的数量,M表示返回的元素的数量。 |
命令描述 | 返回存储在Key(TairZset数据结构)中指定范围内的元素,元素按分值从高到低的顺序排列,按字典序降序排列分数相同的元素。 说明 除排序方式相反外,本命令和EXZRANGE用法相似。 |
选项 |
|
返回值 | 返回指定范围内的元素列表,如果使用了WITHSCORES选项,则返回结果中包含元素的分数。 |
示例 | 命令示例:
返回示例:
|
EXZRANGEBYSCORE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N表示TairZset中元素的数量,M表示返回的元素的数量。 说明 当M为常量时(例如使用LIMIT选项指定总是返回前10个元素时),可将该公式看作O(log(N))。 |
命令描述 | 返回存储在Key(TairZset数据结构)中,分数大于等于min且小于等于max值的所有元素,返回元素按分数从低到高排列,分数相同的元素按照字典顺序返回。 |
选项 |
|
返回值 | 返回指定分数范围内的元素列表,如果使用了WITHSCORES选项,则返回结果中包含元素的分数。 |
命令示例 | 命令示例:
返回示例:
|
EXZREVRANGEBYSCORE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M) ,其中,N表示TairZset中元素的数量,M表示返回的元素的数量。 说明 当M为常量时(比如使用LIMIT选项指定总是返回前10个元素时),可将该公式看作O(log(N))。 |
命令描述 | 返回存储在Key(TairZset数据结构)中,分数大于等于min且小于等于max值的所有元素。和TairZset中元素默认排序相反,该命令返回元素按照分数从高到低排列,分数相同的元素按照逆字典序排列。 说明 除排序方式相反以外,本命令和EXZRANGEBYSCORE用法相似,注意本命令中max在前。 |
选项 |
|
返回值 | 返回指定分数范围内的元素列表,如果使用了WITHSCORES选项,则返回结果中包含元素的分数。 |
命令示例 | 命令示例:
返回示例:
|
EXZRANGEBYLEX
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N表示TairZset中元素的数量,M表示返回的元素的数量。 说明 当M为常量时(例如使用LIMIT选项指定返回前10个元素时),可将该公式看作O(log(N))。 |
命令描述 | 为确保元素按照字典序排列,当Key中所有元素分数相同时,则该命令返回存储在Key中介于min和max值之间的元素。 说明
|
选项 |
|
返回值 | 返回元素名称在指定范围内的元素列表。 |
命令示例 | 命令示例:
返回示例:
|
EXZREVRANGEBYLEX
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N表示TairZset中元素的数量,M表示返回的元素的数量。 说明 当M为常量时(例如使用LIMIT选项指定总是返回前10个元素时),可将该公式看作O(log(N))。 |
命令描述 | 为确保元素按照字典序排列,当Key中所有元素分数相同时,则该命令返回存储在Key中介于max和min之间的元素。 说明 除排序方式相反外,本命令和EXZRANGEBYLEX用法相同,注意本命令中max在前。 |
选项 |
|
返回值 | 返回元素名称在指定范围内的元素列表。 |
命令示例 | 命令示例:
返回示例:
|
EXZREM
类别 | 说明 |
语法 |
|
时间复杂度 | O(M*log(N)),其中,N为TairZset中元素的数量,M为待移除的元素的数量。 |
命令描述 | 移除存储Key中的指定成员,如果指定成员不存在,则忽略。 说明 如果指定的Key存在,但其数据结构不是TairZset,系统将返回错误。 |
选项 | 无 |
返回值 | 返回Key中被移除的成员数量,不包含不存在的成员。 |
命令示例 | 命令示例:
返回示例:
|
EXZREMRANGEBYSCORE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N为TairZset中元素的数量,M为待移除的元素的数量。 |
命令描述 | 移除存储在Key(TairZset数据结构)中,分数大于等于min且小于等于max值的元素。 |
选项 | min和max分别表示最小分数和最大分数,如Key中的元素采用了多维度的分数,各维度的分数之间使用井号(#)分隔。 说明
|
返回值 | 返回被移除的元素的数量。 |
命令示例 | 命令示例:
返回示例:
|
EXZREMRANGEBYRANK
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N为TairZset中元素的数量,M为该操作移除的元素的数量。 |
命令描述 | 移除存储在Key(TairZset数据结构)中,级别介于start和stop之间的元素。 |
选项 | start和stop均为基于零的索引值,其中,0代表分数最低的元素。 当索引值为负数,代表从最高分数元素开始的偏移量,例如-1为分数最高的元素,-2为分数第二高的元素,依此类推。 |
返回值 | 被移除的元素的数量。 |
命令示例 | 命令示例:
返回示例:
|
EXZREMRANGEBYLEX
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)+M),其中,N为TairZset中元素的数量,M为该操作移除的元素的数量。 |
命令描述 | 为确保元素按照字典序排列,当Key中所有元素分数相同时,则该命令移除存储在Key中介于max和min之间的元素。 说明 若使用相同的min和max参数值执行该命令和EXZRANGEBYLEX命令,则该命令移除的元素与EXZRANGEBYLEX命令返回的元素相同。 |
选项 | min、max:分别表示成员名称的最小值和最大值(字符串形式),需指定字符的区间,例如
|
返回值 | 被移除的元素的数量。 |
命令示例 | 命令示例:
返回示例:
|
EXZCARD
类别 | 说明 |
语法 |
|
时间复杂度 | O(1) |
命令描述 | 返回存储在Key(TairZset数据结构)中的基数(即元素的个数)。 |
选项 | 无 |
返回值 | 返回Key中的元素的数量,如果Key不存在,则返回0。 |
命令示例 | 命令示例:
返回示例:
|
EXZRANK
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)) |
命令描述 | 返回存储在Key(TairZset数据结构)中的成员的级别,按照分数由低到高排列。 级别(或索引)从0开始计数,即分数最低的成员的级别为0。 |
选项 | 无 |
返回值 |
|
命令示例 | 命令示例:
返回示例:
|
EXZREVRANK
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)) |
命令描述 | 返回存储在Key(TairZset数据结构)中的成员的级别。返回结果按照分数从高到低排列。 级别(或索引)从0开始计数,即分数最高的成员的级别为0。 说明 除排序规则相反外,本命令和EXZRANK用法类似。 |
选项 | 无 |
返回值 |
|
命令示例 | 命令示例:
返回示例:
|
EXZCOUNT
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)),其中,N为TairZset中元素的数量。 说明 由于采用了元素级别获取查询范围,该操作涉及的工作量和查询范围的大小即不成正比。 |
命令描述 | 返回存储在Key(TairZset数据结构)中,分数介于min和max之间的元素的个数。 |
选项 | min、max:分别表示最小分数和最大分数,如Key中的元素采用了多维度的分数,各维度的分数之间使用井号(#)分隔。 说明
|
返回值 | 返回分数在指定范围内的元素的数量(整数)。 |
命令示例 | 命令示例:
返回示例:
|
EXZLEXCOUNT
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)),其中,N为TairZset中元素的数量。 说明 由于采用了元素级别获取查询范围,该操作涉及的工作量和查询范围的大小即不成正比。 |
命令描述 | 为确保元素按照字典序排列,若Key中所有元素分数相同,则该命令返回存储在Key,值介于min和max之间的元素的数量。 说明
|
选项 | min、max:分别表示成员名称的最小值和最大值(字符串形式),需指定字符的区间,例如
|
返回值 | 返回分数在指定范围内的元素的个数(整数)。 |
命令示例 | 命令示例:
返回示例:
|
EXZRANKBYSCORE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)) |
命令描述 | 计算指定的分数在Key(TairZset数据结构)中按照分数从低到高排序的排名位置。级别(或索引)从0开始计数,即分数最低的成员的级别为0。 说明 若指定的分数不存在,则返回该分数在Key(TairZset数据结构)中的预计排名;若指定的分数已存在,Tair会默认将指定的分数排在已存在的分数之前。 |
选项 | 无 |
返回值 | 返回指定分数在Key中的排名。 |
命令示例 | 命令示例:
返回示例:
|
EXZREVRANKBYSCORE
类别 | 说明 |
语法 |
|
时间复杂度 | O(log(N)) |
命令描述 | 计算指定的分数在Key(TairZset数据结构)中按照分数从高到低排序的排名位置。级别(或索引)从0开始计数,即分数最高的成员的级别为0。 说明 若指定的分数不存在,则返回该分数在Key(TairZset数据结构)中的预计排名;若指定的分数已存在,Tair会默认将指定的分数排在已存在的分数之后。 |
选项 | 无 |
返回值 | 返回指定分数在Key中的排名。 |
命令示例 | 命令示例:
返回示例:
|