百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

在Spring Boot中利用Redis实现排行榜功能?

wptr33 2025-02-03 15:29 18 浏览

Redis是目前比较流行的高性能的内存数据库,支持了比较丰富的数据库结构,其中我们可以通过Sorted Set数据结构来进行排行榜操作的处理,它不仅支能够以有序的方式来存储分值,还可以支持比较高效的数据查询操作,下面我们就来看看如何在Spring Boot中通过Redis实现排行榜操作。

配置Spring Boot与Redis的连接

首先需要在POM文件中添加Redis相关的配置依赖,如下所示。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

然后再application.yml配置文件中,添加Redis的链接配置,如下所示。

spring:
  redis:
    host: localhost
    port: 6379
    password: "" # 如果未设置密码,可留空
    lettuce:
      pool:
        max-active: 10
        max-idle: 5
        min-idle: 1
    timeout: 5000

实现排行榜功能

接下来就是通过Sorted Set来实现一个排行榜功能接口,如下所示。

public interface LeaderboardService {
    void addScore(String userId, double score);
    Double getScore(String userId);
    List<String> getTopUsers(int top);
    Long getUserRank(String userId);
}
  • addScore:将用户的分数添加到 Redis 的有序集合中。如果用户已经存在,分数会被更新。
  • getScore:获取用户当前的分数。
  • getTopUsers:获取排行榜前 N 名的用户。
  • getUserRank:获取用户的排名(从 1 开始)。

实现排行榜服务

具体实现上面的接口,来实现相关的操作。

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

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

@Service
public class LeaderboardServiceImpl implements LeaderboardService {

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

    private final StringRedisTemplate redisTemplate;

    public LeaderboardServiceImpl(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public void addScore(String userId, double score) {
        redisTemplate.opsForZSet().add(LEADERBOARD_KEY, userId, score);
    }

    @Override
    public Double getScore(String userId) {
        return redisTemplate.opsForZSet().score(LEADERBOARD_KEY, userId);
    }

    @Override
    public List<String> getTopUsers(int top) {
        return redisTemplate.opsForZSet()
                .reverseRange(LEADERBOARD_KEY, 0, top - 1)
                .stream()
                .collect(Collectors.toList());
    }

    @Override
    public Long getUserRank(String userId) {
        Long rank = redisTemplate.opsForZSet().reverseRank(LEADERBOARD_KEY, userId);
        return rank != null ? rank + 1 : null; // Redis ranks start from 0
    }
}

编写RESTful API

编写一个Controller控制器,提供给前端调用来实现相关的页面功能,如下所示。

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

    private final LeaderboardService leaderboardService;

    public LeaderboardController(LeaderboardService leaderboardService) {
        this.leaderboardService = leaderboardService;
    }

    @PostMapping("/add")
    public void addScore(@RequestParam String userId, @RequestParam double score) {
        leaderboardService.addScore(userId, score);
    }

    @GetMapping("/score/{userId}")
    public Double getScore(@PathVariable String userId) {
        return leaderboardService.getScore(userId);
    }

    @GetMapping("/top/{top}")
    public List<String> getTopUsers(@PathVariable int top) {
        return leaderboardService.getTopUsers(top);
    }

    @GetMapping("/rank/{userId}")
    public Long getUserRank(@PathVariable String userId) {
        return leaderboardService.getUserRank(userId);
    }
}

总结

接下来,我们就可以调用上面的接口来实现相关的业务逻辑操作,通过Sorted Set数据结构,可以使得实现排行榜功能更加高效简单。在生产环境中,我们可以结合Redis集群操作来满足高并发场景下的排行榜需求。

相关推荐

开发者必看的八大Material Design开源项目

MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...

另类插这么可爱,一定是…(另类t恤)

IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...

Android常用ADB命令(安卓adb工具是什么)

杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...

微软Mac版PowerPoint测试Reading Order Pane功能

IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...

Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍

前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...

用云存储30分钟快速搭建APP,你信吗?

背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...

谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果

Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...

iOS文本编辑控件UITextField和UITextVie

记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...

Android入门图文教程集锦(android 入门教程)

Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...

如何使用Android自定义复合视图(如何使用android自定义复合视图)

在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...

原生安卓开发app的框架frida常用关键代码定位

前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...

教程10 | 三分钟搞定一个智能输入法程序

一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...

(Android 8.1) 功能与新特性(android的功能)

和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...

怎样设置EditText内部文字被锁定不可删除和修改

在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...

如何阻止 Android 活动启动时 EditText 获得焦点

技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...