200 views
owned this note
# Leaderboard方案
### leaderboard在console的配置
| 配置项名称 | 配置项含义 |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| ID (key) (由console生成) | 每个排行榜配置的唯一标识 |
| 名称 (name) (必填) | 排行榜名称 |
| 指标 (key) (必填) | 指标名称 (exp:kill)增加与pigat联动,可以是pigat中的数值,例如player.level |
| 大小 (size) (必填) | 排行榜大小 (榜单名次外的对象不参与排名) |
| 顺序 (order) (必填) | 正序(ASC)还是倒序(DESC) |
| 是否为周期榜 (is_cycle) (必填) | 如果为false,则表示此榜单为起止时间内的一次性榜单,如果为true,则需要提供具体周期 |
| 周期单位 (cycle_unit) | 提供三个单位描述周期,最大精度到小时,最小精度到月,h=小时,d=天,m=月 |
| 周期长度 (cycle_length) | 描述所选周期单位的长度 |
| 起始时间 (start_time) (必填) | 2020101700 描述精度到小时 |
| 终止时间 (end_time) | 2020111700 描述精度到小时 (对于一直要维持的榜单可以没有终止时间) |
------
leaderboard与pigat联动后的console相关变更:
<span style="color:green">新增id</span>
<span style="color:green">新增key</span>
<span style="color:orange">拆分cycle为cycle_length与cycle_unit</span>
<span style="color:orange">name的意义改变</span>
<span style="color:red">移除keep</span>
<span style="color:red">移除GMT</span>
--------
### 约定项
1. leaderboard模块本身只接受全量数据的排名
2. 提供的全量指标数据不会为负
3. 查询特定目标在榜单上的排名时,如果目标的排名超过榜单的大小,则目标的排名返回值为-1。
### redis内存占用计算
按照1000组数据为一个排行榜大小的标准,浮动的dataset占用约~1mb。
而以减少redis操作为标准,当排行榜达到约定大小的两倍才会进行清理(2x1000),则一个标准榜单占用约为~2mb。
### redis key设计
leaderboard模块使用room作为存储,key类型为zset。
redis key的格式为
`app_id:leaderboard:{leaderboard_id:leaderboard_interval}:data`
### 01 POST 传入榜单数据
**server to server:** {bp_server}/bp/server/user/{user_id}/leaderboard/data
| Required Headers |
| ---------------------- |
| X-BytePower-Auth-Token |
**client to server:** {bp_server}/bp/leaderboard/data
| Required Headers |
| ------------------------- |
| X-BytePower-Sign |
| X-BytePower-Session-Token |
| 参数 | 类型 | 示例 | 说明 |
| ---- | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------- |
| key | float64 | "kill": 12 | 对应console上的配置,例如配置了一个击杀排行榜,其key为"kill",对应的数值为12,则传入{"kill":12},支持一次传入多个key的变动。 |
输入示例:
```json=
{
"kill":12,
"assist":15,
"death":5,
"kda":5.4
}
```
返回示例:
code:200
```json=
{
"updated_leaderboards":[
{
"name":"击杀日榜",
"interval":"2021120800:2021120900"
},{
"name":"击杀月榜",
"interval":"2021120100:2022010100"
},{
"name":"击杀总榜",
"interval":"2021120100:-"
}
]
}
```
> 注: 如果传入key的数值没有对应配置的榜单追踪记录数据,则会直接跳过。例如如果只配置了击杀(key:kill)的相关榜单,则传入的其他数值作为无效数据被忽略。
### 02 POST 查询榜单
**server to server:** {bp_server}/bp/server/user/{user_id}/leaderboard
| Required Headers |
| ---------------------- |
| X-BytePower-Auth-Token |
**client to server:** {bp_server}/bp/leaderboard
| Required Headers |
| ------------------------- |
| X-BytePower-Sign |
| X-BytePower-Session-Token |
| 参数 | 类型 | 示例 | 说明 |
| ---------------- | ------ | ---------- | ----------------------------------------------------------------------------- |
| leaderboard_name | string | "击杀日榜" | 排行榜的名称 |
| x_backwards | int | 3 | 查看距今第3个历史榜单 |
| top | int | 50 | 查看榜单的top多少 |
| member | string | "user_123" | 查看榜单上user_123的排名 |
| around | int | 5 | 与member一起使用,查看member上下5名,加上member自己,总计最多11名的排名数据。 |
输入示例:
```json=
{
"queries":[
{
"leaderboard_name":"击杀日榜",
"top":100
},{
"leaderboard_name":"击杀日榜",
"x_backwards":3,
"top":100
},{
"leaderboard_name":"击杀日榜",
"member":"user_123"
},{
"leaderboard_name":"击杀日榜",
"member":"user_123",
"around":5
},{
"leadeboard_name":"击杀日榜",
"x_backwards":3,
"member":"user_123",
"around":5
}
]
}
```
返回示例:
code:200
```json=
{
"results":[
{
"leaderboard_name":"击杀日榜",
"top":[
{
"member":"user1",
"score":1000,
"rank":1
},
{
"member":"user2",
"score":999,
"rank":2
},
{
"member":"user3",
"score":980,
"rank":3
},
...
],
"order":"DESC",
"period":"2021120800:2021120900",
"request_time":"",
},
...
]
}
```