12.29 redis实现一个简单排行榜

项目描述:Redis实现的实时排行榜系统

本项目是一个基于 Spring Boot 和 Redis 的实时排行榜系统,利用 Redis 的有序集合(ZSet)数据结构高效地管理用户分数和排名。 用于Redis中Zset数据结构学习

Service

java 复制代码
package org.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
public class LeaderboardService {

    private static final String LEADERBOARD_KEY = "game:leaderboard";

    @Autowired
    private StringRedisTemplate redisTemplate;

    // 增加或更新用户分数
    public void addOrUpdateScore(String userId, double score) {
        redisTemplate.opsForZSet().addIfAbsent(LEADERBOARD_KEY,userId,score);
    }


    // 获取用户排名(Redis 排名从 0 开始)
    public Long getUserRank(String userId) {
        Long l = redisTemplate.opsForZSet().reverseRank(LEADERBOARD_KEY, userId);
        if(l==null)return null;
        return l+1;
    }

    // 获取用户分数
    public Double getUserScore(String userId) {
        Double score = redisTemplate.opsForZSet().score(LEADERBOARD_KEY, userId);
        if(score==0)
            return null;
        return score;
    }

    // 获取排行榜前 N 名
    public Set<String> getTopUsers(int topN) {
        return   redisTemplate.opsForZSet().reverseRange(LEADERBOARD_KEY, 0, topN - 1);

    }
}

下面是control

java 复制代码
package org.example.control;

import org.example.service.LeaderboardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/leaderboard")
public class LeaderboardController {

    @Autowired
    private LeaderboardService leaderboardService;

    // 增加或更新用户分数
    @PostMapping("/add")
    public String addScore(@RequestParam String userId, @RequestParam double score) {
        leaderboardService.addOrUpdateScore(userId, score);
        return "Score added/updated successfully!";
    }

    @PostMapping("/addBatch")
    public String addScoresBatch(@RequestBody List<Map<String, Object>> users) {
        for (Map<String, Object> user : users) {
            String userId = (String) user.get("userId");
            double score = Double.parseDouble(user.get("score").toString());
            leaderboardService.addOrUpdateScore(userId, score);
        }
        return "Batch scores added/updated successfully!";
    }
    // 获取用户排名和分数
    @GetMapping("/rank/{userId}")
    public Map<String, Object> getUserRank(@PathVariable String userId) {
        Long rank = leaderboardService.getUserRank(userId);
        Double score = leaderboardService.getUserScore(userId);

        return Map.of(
                "userId", userId,
                "rank", rank,
                "score", score
        );
    }

    // 获取排行榜前 N 名
    @GetMapping("/top/{topN}")
    public Map<String, Object> getTopUsers(@PathVariable int topN) {
        Set<String> topUsers = leaderboardService.getTopUsers(topN);
        
        // 获取每个用户的分数
        Map<String, Object> leaderboard = topUsers.stream()
                .collect(Collectors.toMap(
                        userId -> userId,
                        userId -> leaderboardService.getUserScore(userId)
                ));

        return Map.of("leaderboard", leaderboard);
    }
}
相关推荐
YangYang9YangYan31 分钟前
2026 校招审计风控岗位 JD 拆解,工具、专业能力与面试考点
java·大数据·人工智能·数据分析
weixin_460443562 小时前
考试监控大屏为什么不能直接查数据库?WebSocket、Redis与实时数据聚合架构设计
数据库·redis·在线考试系统·培训考试系统·煤矿培训考试系统·煤矿在线考试系统·宏远培训考试系统
wuminyu6 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
九皇叔叔7 小时前
【第二章】Redis基础入门:Redis是什么、为什么快以及核心特性详解
数据库·redis·缓存
考虑考虑7 小时前
Java实现hmacsha256加密算法
java·后端·java ee
captain3767 小时前
▲网络原理(2)-TCP
java·服务器·网络·tcp/ip·java-ee
MetaLite7 小时前
SpringBoot接口分层规范-外网网关内部服务与参数边界
java·数据库·spring boot
Co_Hui7 小时前
Java 线程状态
java
凤山老林8 小时前
聊聊企业级 API 安全:Spring Boot 落地 OAuth 2.1、mTLS 与接口签名防篡改
spring boot·后端·安全·oauth
土司大王8 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode