基于Redis实现在线游戏积分排行榜!体验一下云服务器!

布满荆棘的人生 2022-10-29 01:58 198阅读 0赞

基于Redis实现在线游戏积分排行榜

体验地址:https://developer.aliyun.com/adc/scenario/44d54481170f4914996d3ae53b818f32?spm=a2c6h.15013979.J\_7591448770.47.60ff7077owk8FW

体验目标

本场景将提供一台配置了CentOS 7.7的ECS实例(云服务器)和一个Redis 5.0数据库实例。通过本教程的操作,您可以使用Java语言实现基于Redis数据库的游戏玩家积分排行榜功能。

背景知识

  • Redis

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets) 和有序集合(sorted sets)等类型。ZSet(sorted sets)是一个有序的集合,内部使用HashMap和跳跃表(SkipList)来保证数据的有序存储,HashMap里放的是成员到Score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的Score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。排行榜是有序集合的经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

  • 云数据库Redis版

云数据库Redis版(ApsaraDB for Redis)是兼容开源Redis协议标准、提供内存加硬盘的混合存储方式的数据库服务,基于高可靠双机热备架构及可平滑扩展的集群架构,满足高读写性能场景及弹性变配的业务需求。

  • Apache Maven

Maven是Apache开源的一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。但是由于国外的仓库经常连接不上,即便是连接上,下载速度也很慢。阿里云提供了基于Maven官方的镜像仓库,镜像仓库采用OSS(对象存储)作为后端存储,下载速度快,支持高并发,而且全站进行了HTTPS加密,更安全。

学习目录

  • 实验详情
    1. 创建资源
    1. 连接ECS服务器
    1. 搭建Java环境
    1. 开发游戏玩家积分排行榜功能

创建资源

  1. 在页面左侧,单击 云产品资源 下拉菜单,查看本次实验资源。
  2. 单击 免费开通 创建所需资源。

资源创建过程需要1~3分钟。完成实验资源的创建后,您可以在 云产品资源 列表查看已创建的资源信息,例如:IP地址、用户名和密码等。

连接ECS服务器

  1. 打开终端工具。

    • Windows:打开命令窗口。
    • MAC:打开命令行终端Terminal。

Windows用户请检查系统中是否安装有SSH工具。检查方法:

在终端中输入命令 ssh -V 。

  1. ssh -V

如果显示SSH版本则表示已安装,如下图所示。

img

如果未安装,请下载安装 OpenSSH工具。

  1. 在终端中输入连接命令ssh [username]@[ipaddress]。

您需要将其中的username和ipaddress替换为步骤一中创建的ECS服务器的弹性公网IP。例如:

  1. ssh root@123.123.123.123

img

命令显示结果如下:

img

  1. 输入yes。
  2. 同意继续后将会提示输入登录密码。 密码为已创建的云服务的ECS的登录密码。

img

登录成功后会显示如下信息。

img

搭建Java环境

本步骤将在ECS服务器上搭建一个Java开发环境,包括OpenJDK 1.8和Maven 3.6.3,并配置阿里云镜像仓库。

操作步骤:

  1. 安装OpenJDK 1.8。

    yum -y install java-1.8.0-openjdk-devel.x86_64

  2. 下载Maven安装包。

    wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

  3. 将下载的安装包解压到/usr/local/目录,并将安装目录重命名。

    tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/ &&
    mv /usr/local/apache-maven-3.6.3/ /usr/local/maven

  4. 将Maven的可执行文件目录加入到系统环境变量中,并使用source命令使/etc/profile文件中的内容立即生效。

    echo “export PATH=$PATH:/usr/local/maven/bin” >> /etc/profile
    source /etc/profile

  5. 执行以下命令打开镜像仓库配置文件,添加阿里云镜像仓库配置。

a. 使用vim打开镜像仓库配置文件。

  1. vim /usr/local/maven/conf/settings.xml

b. 进入vim编辑器页面后输入 :/mirrors ,搜索并跳转到 标签的位置。

c. 按下 n 键跳转到第二个没有被注释的标签位置。

d. 按下 o 键,另起一行进行编辑,粘贴以下内容。

  1. <mirror>
  2. <id>nexus-aliyun</id>
  3. <mirrorOf>central</mirrorOf>
  4. <name>Nexus aliyun</name>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  6. </mirror>

e. 按下 ECS 退出编辑模式,输入 :wq 保存并退出vim编辑器。

添加阿里云镜像仓库配置如下图所示:

img

开发游戏玩家积分排行榜功能

操作步骤:

  1. 执行以下命令创建并进入工作空间。

    mkdir -p demo/src/main/java/test/ && cd demo

  2. 参考以下步骤编辑代码文件。

a. 使用vim打开GameRankSample.java文件。

  1. vim src/main/java/test/GameRankSample.java

b. 输入:set paste 回车后按下i键进入vim的粘贴插入模式,新增以下内容。

  1. package test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Set;
  5. import java.util.UUID;
  6. import redis.clients.jedis.Jedis;
  7. import redis.clients.jedis.Tuple;
  8. public class GameRankSample {
  9. static int TOTAL_SIZE = 20;
  10. public static void main(String[] args)
  11. {
  12. //Redis数据库连接地址
  13. String host = "xxxxxxxxxx.m.cnhz1.kvstore.aliyuncs.com";
  14. //连接密码
  15. String password = "password";
  16. int port = 6379;
  17. Jedis jedis = new Jedis(host, port);
  18. try {
  19. String authString = jedis.auth(password);
  20. if (!authString.equals("OK"))
  21. {
  22. System.err.println("AUTH Failed: " + authString);
  23. return;
  24. }
  25. //Key(键)
  26. String key = "游戏名:奔跑吧,阿里!";
  27. //清除可能的已有数据
  28. jedis.del(key);
  29. //模拟生成若干个游戏玩家
  30. List<String> playerList = new ArrayList<String>();
  31. for (int i = 0; i < TOTAL_SIZE; ++i)
  32. {
  33. //随机生成每个玩家的ID
  34. playerList.add(UUID.randomUUID().toString());
  35. }
  36. System.out.println("输入所有玩家 ");
  37. //记录每个玩家的得分
  38. for (int i = 0; i < playerList.size(); i++)
  39. {
  40. //随机生成数字,模拟玩家的游戏得分
  41. int score = (int)(Math.random()*5000);
  42. String member = playerList.get(i);
  43. System.out.println("玩家ID:" + member + ", 玩家得分: " + score);
  44. //将玩家的ID和得分,都加到对应key的SortedSet中去
  45. jedis.zadd(key, score, member);
  46. }
  47. //输出打印全部玩家排行榜
  48. System.out.println();
  49. System.out.println(" "+key);
  50. System.out.println(" 全部玩家排行榜 ");
  51. //从对应key的SortedSet中获取已经排好序的玩家列表
  52. Set<Tuple> scoreList = jedis.zrevrangeWithScores(key, 0, -1);
  53. for (Tuple item : scoreList) {
  54. System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue());
  55. }
  56. //输出打印Top5玩家排行榜
  57. System.out.println();
  58. System.out.println(" "+key);
  59. System.out.println(" Top 玩家");
  60. scoreList = jedis.zrevrangeWithScores(key, 0, 4);
  61. for (Tuple item : scoreList) {
  62. System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue());
  63. }
  64. //输出打印特定玩家列表
  65. System.out.println();
  66. System.out.println(" "+key);
  67. System.out.println(" 积分在1000至2000的玩家");
  68. //从对应key的SortedSet中获取已经积分在1000至2000的玩家列表
  69. scoreList = jedis.zrangeByScoreWithScores(key, 1000, 2000);
  70. for (Tuple item : scoreList) {
  71. System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue());
  72. }
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. }finally{
  76. jedis.quit();
  77. jedis.close();
  78. }
  79. }
  80. }

c. 按下 ESC 键退出粘贴插入模式,然后输入:set nopaste 回车后按下i键进入vim的普通插入模式,将代码中的 hostpassword的变量的值替换为左侧资源栏体验平台提供给您的 Redis内网****地址Redis密码

d. 按下 ESC 键退出编辑模式,进入命令模式输入命令 :wq,保存并退出vim。

  1. 参考以下步骤创建pom.xml配置文件。

a. 使用vim打开pom.xml文件。

  1. vim pom.xml

b. 按下 i 键进入vim的编辑模式,新增以下内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>test</groupId>
  5. <artifactId>demo</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <name>demo</name>
  8. <description>Demo project</description>
  9. <properties>
  10. <java.version>1.8</java.version>
  11. </properties>
  12. <dependencies>
  13. <dependency>
  14. <groupId>redis.clients</groupId>
  15. <artifactId>jedis</artifactId>
  16. <version>2.9.0</version>
  17. </dependency>
  18. </dependencies>
  19. <build>
  20. <plugins>
  21. <plugin>
  22. <artifactId>maven-assembly-plugin</artifactId>
  23. <configuration>
  24. <appendAssemblyId>false</appendAssemblyId>
  25. <descriptorRefs>
  26. <descriptorRef>jar-with-dependencies</descriptorRef>
  27. </descriptorRefs>
  28. <archive>
  29. <manifest>
  30. <!--jar入口类,格式Package.ClassName -->
  31. <mainClass>test.GameRankSample</mainClass>
  32. </manifest>
  33. </archive>
  34. </configuration>
  35. <executions>
  36. <execution>
  37. <id>make-assembly</id>
  38. <phase>package</phase>
  39. <goals>
  40. <goal>assembly</goal>
  41. </goals>
  42. </execution>
  43. </executions>
  44. </plugin>
  45. ion>
  46. <id>make-assembly</id>
  47. <phase>package</phase>
  48. <goals>
  49. <goal>assembly</goal>
  50. </goals>
  51. </execution>
  52. </executions>
  53. </plugin>

发表评论

表情:
评论列表 (有 0 条评论,198人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis排行榜实现

    根据上一篇的[设计][Link 1]进一步结合实际场景进行实现,通过伪代码的形式展开。现假设有以下场景: > 游戏闯关排行榜以通关次数正序、复活次数倒序和第一次通关的时间倒序

    相关 Redis实现排行榜功能

    在实际生活中,排行榜的例子随处可见,如考试成绩排名、商品销售排名、游戏等价或积分排名,以及热门文章或帖子的点赞数、访问量等相关的排名等。要实现一个排行榜功能,可以利用 Redi