亿级用户游戏排行榜设计方案

该博客介绍了如何设计亿级用户的游戏排行榜系统,包括使用Redis进行排名存储,通过lua脚本保证原子性操作解决并发安全问题。同时,详细展示了获取排行榜列表、用户个人排名以及段位功能的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

en -> new DefaultTypedTuple<>((String) en.get(“userId”),

(Double) en.get(“score”))).collect(Collectors.toSet());

// 计算排行榜前先将topN桶删除,防止之前进入桶的用户干扰

redisUtil.delAndZaddExec(GameConstant.USER_SCORE_RANKING_TOPN, vals);

return doTopNScoreList(topN);

}

public List<Map<String, Object>> commonScoreList(String bucketValue, Long topN) {

Set<ZSetOperations.TypedTuple> rangeWithScores

= redisUtil.zRevrangeWithScore(bucketValue, 0L, topN - 1);

List<ZSetOperations.TypedTuple> userScoreTuples = new ArrayList<>(rangeWithScores);

return userScoreTuples.stream().map(tuple -> {

String userId = tuple.getValue();

Double score = tuple.getScore();

Map<String,Object> map = new HashMap<>();

map.put(“userId”, userId);

map.put(“score”, score);

return map;

}).collect(Collectors.toList());

}

public List doTopNScoreList(Long topN) {

List userIdList = new ArrayList<>();

Set<ZSetOperations.TypedTuple> rangeWithScores

= redisUtil.zRevrangeWithScore(GameConstant.USER_SCORE_GENERAL_RANKING_TOPN, 0L, topN - 1);

List<ZSetOperations.TypedTuple> userScoreTuples = new ArrayList<>(rangeWithScores);

List collect = userScoreTuples.stream().map(tuple -> {

String userId = tuple.getValue();

Double score = tuple.getScore();

userIdList.add(userId);

return GameRanking.builder()

.userNo(userId)

.leaderboardS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值