# practice-rank **Repository Path**: Sinux/practice-rank ## Basic Information - **Project Name**: practice-rank - **Description**: Golang 实现的游戏榜单(基于 Redis ) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-15 - **Last Updated**: 2024-03-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Rank ## 需求 请根据个人技术特长,编程语言不限,优先使用 **Go**。 你开发了一个游戏,日活跃用户在10万人以上。请设计一个活动排行榜系统。在每月活动中,玩家得到的活动总分为0到10000之间的整数。在每月活动结束之后,需要依据这一活动总分,从高到低为玩家建立排行榜。如果多位玩家分数相同,则按得到指定分数顺序排序,先得到的玩家排在前面系统提供玩家名次查询接口,玩家能够查询自己名次前后10位玩家的分数和名次。 请使用UML图或线框图表达设计,关键算法可使用流程图或伪代码表达。 如果玩家分数,触发时间均相同,则根据玩家等级,名字依次排序,此情景如何设计?(这条属于额外的答题内容,给出思路就可以) ## 分析 根据题目信息当前 DAU 为 10w+, 大致推断 MAU 为 30W ~ 50W。这个数量级的活动数据使用 MySQL/MongoDB、Redis都可完成存储,但考虑到是活动数据(生命周期不长)倾向使用 Redis 存储数据。 给数据键添加过期时间,待活动结束一段时间后自动清除数据。另外活动结束后,榜单数据变为只读,此时可以增加二级缓存,已减少对 Redis 的频繁查询。 ## 数据倾斜及热 key 问题 可以先将玩家数据分成若干组,待活动结束时。通过集合操作来合并并重新排序。 ## 榜单分值多维度 由于 ZSET 中的 score 只能储存 64 bit,所以需将玩家分值与等级信息通过位运算的方式组合成一个 int64 。 ## 网页 后台: http://localhost:8080/svr/backend/ swagger: http://localhost:8080/swagger/index.html