实现一个基于哈希的分布式实时游戏排行榜系统(支持分数更新和Top K查询)
字数 560 2025-12-03 00:53:39
实现一个基于哈希的分布式实时游戏排行榜系统(支持分数更新和Top K查询)
题目描述:设计一个分布式实时游戏排行榜系统,支持以下操作:
- 添加或更新玩家分数(addScore(playerId, score))
- 查询前K名最高分玩家(topK(k))
- 查询某个玩家的排名和分数(getPlayerInfo(playerId))
系统需要处理高并发更新和查询,并保证数据一致性。
解题过程:
步骤1:设计数据结构
我们需要两个核心数据结构:
- 哈希表(playerMap):存储玩家ID到分数的映射,实现O(1)的分数更新
- 有序结构(rankTree):用于维护分数排名,支持Top K查询
具体实现:
class DistributedLeaderboard:
def __init__(self):
self.player_map = {} # {player_id: score}
self.rank_tree = SortedDict() # {score: set(player_ids)}
步骤2:分数更新操作
def addScore(self, playerId: int, score: int) -> None:
if playerId in self.player_map:
# 移除旧分数
old_score = self.player_map[playerId]
self.rank_tree[old_score].remove(playerId)
if not self.rank_tree[old_score]:
del self.rank_tree[old_score]
# 更新分数
new_score = old_score + score
else:
new_score = score
# 更新哈希表
self.player_map[playerId] = new_score
# 更新有序结构
if new_score not in self.rank_tree:
self.rank_tree[new_score] = set()
self.rank_tree[new_score].add(playerId)
步骤3:Top K查询实现
def topK(self, k: int) -> List[int]:
result = []
# 从高分到低分遍历
for score, players in reversed(self.rank_tree.items()):
for player in players:
result.append(player)
if len(result) == k:
return result
return result
步骤4:玩家信息查询
def getPlayerInfo(self, playerId: int) -> Tuple[int, int]:
if playerId not in self.player_map:
return (-1, -1) # 玩家不存在
score = self.player_map[playerId]
rank = 1
# 计算排名:统计所有更高分数的玩家数量
for s in self.rank_tree:
if s > score:
rank += len(self.rank_tree[s])
return (rank, score)
步骤5:分布式扩展考虑
在实际分布式环境中,我们需要:
- 数据分片:按玩家ID哈希分片到不同节点
- 一致性保证:使用分布式锁或版本控制
- 排名计算:使用全局聚合或近似排名算法
优化方案:
- 使用跳表(Skip List)替代平衡树,提高并发性能
- 实现分数压缩,减少内存占用
- 添加缓存层,缓存Top K结果
这个设计确保了:
- 分数更新:O(log n) 时间复杂度
- Top K查询:O(k) 时间复杂度
- 玩家查询:O(log n) 时间复杂度
- 支持高并发操作