基于Redis实现在线游戏积分排行榜
1. 选择实验资源
本实验支持实验资源体验、开通免费试用、个人账户资源三种实验资源方式。
在实验开始前,请您选择其中一种实验资源,单击确认开启实验。
- 如果您选择的是实验资源体验,资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等)。
说明:实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
- 如果您选择的是开通免费试用,下方卡片会展示本实验支持的试用规格,可以选择你要试用的云产品资源进行开通。您在实验过程中,可以随时用右下角icon唤起试用卡片。
说明:试用云产品开通在您的个人账号下,并占用您的试用权益。如试用超出免费试用额度,可能会产生一定费用。
阿里云支持试用的产品列表、权益及具体规则说明请参考开发者试用中心。
2. 创建实验资源
实验前提:
- 创建云服务器ECS实例。
- 创建云数据库Redis实例
- 【注意】本实验需要通过ECS访问Redis实例,请选择与ECS相同的VPC。
说明:如若您的账号下已包含上述资源,即可略过本小节,跳至下一小节继续操作即可。
本步骤仅作为参考使用,你可以根据需求自行选择配置。
本步骤指导您如何创建云服务器ECS、云数据库Redis实例资源。
一、创建云服务器ECS实例
- 打开ECS控制台,在概览页面的我的资源区域,单击创建实例。
- 在基础配置页面,参考如下说明配置ECS基础配置,未提及的配置保持默认选项,然后单击下一步:网络和安全组。
说明:本实验采用以下配置,未提及的配置保持默认选项。
配置说明:
配置项 |
示例 |
说明 |
地域及可用区 |
地域:华东1(杭州) 可用区:随机分配 |
实例创建后,无法直接更改地域和可用区,请谨慎选择。 |
实例规格 |
规格族:共享标准型 s6 实例规格:ecs.s6-c1m1.small |
您可以前往ECS实例可购买地域,查看实例在各地域的可购情况。 |
镜像 |
类型:公共镜像 版本:CentOS 7.7 64位 |
实例启动后,系统盘将完整复制镜像的操作系统和应用数据 |
- 在网络和安全组页面,参考如下说明配置ECS网络和安全组,未提及的配置保持默认选项,然后单击下一步:网络和安全组。
配置说明:
配置项 |
示例 |
说明 |
专有网络 |
默认专有网络 |
选择您的专有网络。如果您要创建专有网络,请单击下方的前往控制台创建。 |
交换机 |
默认交换机 |
选择您的交换机。如果您要创建交换机,请单击下方的前往控制台创建。 |
分配公网IPv4地址 |
选中分配公网IPv4地址 |
选中后,自动分配一个公网IPv4地址。 |
带宽计费模式 |
按使用流量 |
按使用流量模式只需为所消耗的公网流量付费。详情请参见公网带宽计费。 |
带宽峰值 |
5 Mbps |
无。 |
安全组 |
默认安全组 |
选择您的安全组,需要开通80、443、22、3389、3306端口。如果您需要创建安全组,请单击下方的新建安全组。 |
- 在系统配置页面,参考如下说明配置ECS系统配置,未提及的配置保持默认选项,然后单击下一步:分组设置。
配置说明:
配置项 |
示例 |
说明 |
登录凭证 |
自定义密码 |
本教程中选择自定义密码,并手动设置一个密码,用于远程连接并登录ECS实例。 |
登录密码 |
Ecs123456 |
当登录凭证选择自定义密码时,需要设置此选项并确认密码,在后续连接ECS实例时,您需要输入用户名root和此处设置的密码。 |
实例名称 |
EcsQuickStart |
实例名称您可自定义设置。 |
- 在分组设置页面,所有配置保持默认选项,确认订单创建实例。
二、购买创建云数据库Redis实例
本步骤指导您如何创建云数据库Redis实例。
- 访问云数据库Redis版控制台,在左侧导航栏中,单击实例列表。
- 在实例列表页面,单击创建实例。
- 在基础配置页面,参考下图配置Redis的基础配置,未提及的配置保持默认选项,然后单击立即购买。
说明:本实验需要通过ECS访问实例,请选择与ECS相同的VPC,实例一旦创建VPC不可更改。
创建完成后,可返回云数据库redis控制台,切换到已开通实例的地域查看。
3. 搭建Java环境
在实验室页面左侧,单击 图标,切换至Web Terminal,
如您选择的是公共资源,则会自动连接到实验室提供的云服务器ECS。
如您选择的是试用资源/个人资源,需输入ECS登录的用户名和密码进行登录。
本步骤将在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 --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
3. 执行如下命令,将下载的安装包解压到/usr/local/目录,并将安装目录重命名。
tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /usr/local/ && mv /usr/local/apache-maven-3.8.8/ /usr/local/maven
4. 执行如下命令,将Maven的可执行文件目录加入到系统环境变量中,并使用source命令使/etc/profile文件中的内容立即生效。
echo "export PATH=$PATH:/usr/local/maven/bin" >> /etc/profile source /etc/profile
5. 执行如下命令,打开镜像仓库配置文件,添加阿里云镜像仓库配置。
a. 使用vim打开镜像仓库配置文件。
vim /usr/local/maven/conf/settings.xml
b. 进入vim编辑器页面后输入:/mirrors并回车,搜索并跳转到 <mirrors> 标签的位置。
c. 按下n键跳转到第二个没有被注释的标签位置。
d. 按下o键,另起一行进行编辑,粘贴以下内容。
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
e. 按下ECS退编辑模式,输入:wq保存并退出vim编辑器。
添加阿里云镜像仓库配置如下图所示。
4. 开发游戏玩家积分排行榜功能
本步骤将完成开发游戏玩家积分排行榜功能的代码开发。
1. 执行如下命令,创建并进入工作空间。
mkdir -p demo/src/main/java/test/ && cd demo
2. 参考以下步骤编辑代码文件。
a. 执行如下命令,使用vim创建并编辑GameRankSample.java文件。
vim src/main/java/test/GameRankSample.java
b. 输入:set paste回车后,按下i键进入vim的粘贴插入模式,新增以下内容。
package test; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.UUID; import redis.clients.jedis.Jedis; import redis.clients.jedis.Tuple; public class GameRankSample { static int TOTAL_SIZE = 20; public static void main(String[] args) { //Redis数据库连接地址 String host = "xxxxxxxxxx.m.cnhz1.kvstore.aliyuncs.com"; //连接密码 String password = "password"; int port = 6379; Jedis jedis = new Jedis(host, port); try { String authString = jedis.auth(password); if (!authString.equals("OK")) { System.err.println("AUTH Failed: " + authString); return; } //Key(键) String key = "游戏名:奔跑吧,阿里!"; //清除可能的已有数据 jedis.del(key); //模拟生成若干个游戏玩家 List<String> playerList = new ArrayList<String>(); for (int i = 0; i < TOTAL_SIZE; ++i) { //随机生成每个玩家的ID playerList.add(UUID.randomUUID().toString()); } System.out.println("输入所有玩家 "); //记录每个玩家的得分 for (int i = 0; i < playerList.size(); i++) { //随机生成数字,模拟玩家的游戏得分 int score = (int)(Math.random()*5000); String member = playerList.get(i); System.out.println("玩家ID:" + member + ", 玩家得分: " + score); //将玩家的ID和得分,都加到对应key的SortedSet中去 jedis.zadd(key, score, member); } //输出打印全部玩家排行榜 System.out.println(); System.out.println(" "+key); System.out.println(" 全部玩家排行榜 "); //从对应key的SortedSet中获取已经排好序的玩家列表 Set<Tuple> scoreList = jedis.zrevrangeWithScores(key, 0, -1); for (Tuple item : scoreList) { System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue()); } //输出打印Top5玩家排行榜 System.out.println(); System.out.println(" "+key); System.out.println(" Top 玩家"); scoreList = jedis.zrevrangeWithScores(key, 0, 4); for (Tuple item : scoreList) { System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue()); } //输出打印特定玩家列表 System.out.println(); System.out.println(" "+key); System.out.println(" 积分在1000至2000的玩家"); //从对应key的SortedSet中获取已经积分在1000至2000的玩家列表 scoreList = jedis.zrangeByScoreWithScores(key, 1000, 2000); for (Tuple item : scoreList) { System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue()); } } catch (Exception e) { e.printStackTrace(); }finally{ jedis.quit(); jedis.close(); } } }
c. 添加完成后,按下ESC键退出粘贴插入模式,然后输入:set nopaste回车后,按下i键进入vim的普通插入模式,将代码中host和password参数的值替换为Redis内网地址和Redis密码。
说明:
- 如果您使用的是平台资源,请在左侧云产品资源列表中查看Redis内网地址和Redis密码。
- 如果您使用的是免费资源/个人账户资源,请前往云数据库Redis控制台,在实例列表页面,找到创建的Redis数据库,单击实例ID进入基本信息页面,找到Redis内网地址,Redis密码为您创建云数据库Redis时输入的密码。
d. 按下ESC键退出编辑模式,进入命令模式输入命令:wq,保存并退出vim。
3. 参考以下步骤创建pom.xml配置文件。
a. 执行如下命令,使用vim创建并编辑pom.xml文件。
vim pom.xml
b. 按下i键进入vim的编辑模式,新增以下内容。
<?xml version="1.0" encoding="UTF-8"?> <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"> <modelVersion>4.0.0</modelVersion> <groupId>test</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!--jar入口类,格式Package.ClassName --> <mainClass>test.GameRankSample</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
c. 添加完成后,按下ESC键退出编辑模式,进入命令模式输入命令:wq,保存并退出vim。
4. 执行如下命令,打包并运行代码。
mvn clean package assembly:single -DskipTests java -classpath target/demo-0.0.1-SNAPSHOT.jar test.GameRankSample
代码执行效果如下。
5. 释放资源
在完成实验之后,若您想保留实验相关的云产品资源,请随时关注账户扣费情况。若您不想保留实验相关的云产品资源,释放云产品资源即可。
实验链接:https://developer.aliyun.com/adc/scenario/44d54481170f4914996d3ae53b818f32