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

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。

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

1. 选择实验资源

本实验支持实验资源体验、开通免费试用、个人账户资源三种实验资源方式。

在实验开始前,请您选择其中一种实验资源,单击确认开启实验

  • 如果您选择的是实验资源体验,资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等)。

说明:实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

  • 如果您选择的是开通免费试用,下方卡片会展示本实验支持的试用规格,可以选择你要试用的云产品资源进行开通。您在实验过程中,可以随时用右下角icon唤起试用卡片。

说明:试用云产品开通在您的个人账号下,并占用您的试用权益如试用超出免费试用额度,可能会产生一定费用。

阿里云支持试用的产品列表、权益及具体规则说明请参考开发者试用中心


2. 创建实验资源

实验前提:

  • 创建云服务器ECS实例。
  • 创建云数据库Redis实例
  • 注意】本实验需要通过ECS访问Redis实例,请选择与ECS相同的VPC。

说明:如若您的账号下已包含上述资源,即可略过本小节,跳至下一小节继续操作即可。

本步骤仅作为参考使用,你可以根据需求自行选择配置。

本步骤指导您如何创建云服务器ECS、云数据库Redis实例资源。

一、创建云服务器ECS实例

  1. 打开ECS控制台,在概览页面的我的资源区域,单击创建实例
  2. 基础配置页面,参考如下说明配置ECS基础配置,未提及的配置保持默认选项,然后单击下一步:网络和安全组

说明:本实验采用以下配置,未提及的配置保持默认选项。

配置说明:

配置项

示例

说明

地域及可用区

地域:华东1(杭州)

可用区:随机分配

实例创建后,无法直接更改地域和可用区,请谨慎选择。

实例规格

规格族:共享标准型 s6

实例规格:ecs.s6-c1m1.small

您可以前往ECS实例可购买地域,查看实例在各地域的可购情况。

镜像

类型:公共镜像

版本:CentOS 7.7 64位

实例启动后,系统盘将完整复制镜像的操作系统和应用数据

  1. 网络和安全组页面,参考如下说明配置ECS网络和安全组,未提及的配置保持默认选项,然后单击下一步:网络和安全组

配置说明:

配置项

示例

说明

专有网络

默认专有网络

选择您的专有网络。如果您要创建专有网络,请单击下方的前往控制台创建

交换机

默认交换机

选择您的交换机。如果您要创建交换机,请单击下方的前往控制台创建

分配公网IPv4地址

选中分配公网IPv4地址

选中后,自动分配一个公网IPv4地址。

带宽计费模式

按使用流量

按使用流量模式只需为所消耗的公网流量付费。详情请参见公网带宽计费

带宽峰值

5 Mbps

无。

安全组

默认安全组

选择您的安全组,需要开通80、443、22、3389、3306端口。如果您需要创建安全组,请单击下方的新建安全组

  1. 系统配置页面,参考如下说明配置ECS系统配置,未提及的配置保持默认选项,然后单击下一步:分组设置

配置说明:

配置项

示例

说明

登录凭证

自定义密码

本教程中选择自定义密码,并手动设置一个密码,用于远程连接并登录ECS实例。

登录密码

Ecs123456

当登录凭证选择自定义密码时,需要设置此选项并确认密码,在后续连接ECS实例时,您需要输入用户名root和此处设置的密码。

实例名称

EcsQuickStart

实例名称您可自定义设置。

  1. 分组设置页面,所有配置保持默认选项,确认订单创建实例。

二、购买创建云数据库Redis实例

本步骤指导您如何创建云数据库Redis实例。

  1. 访问云数据库Redis版控制台,在左侧导航栏中,单击实例列表

  1. 实例列表页面,单击创建实例

  1. 基础配置页面,参考下图配置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的普通插入模式,将代码中hostpassword参数的值替换为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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
19天前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
39 4
|
存储 缓存 NoSQL
|
存储 SQL 缓存
SpringBoot集成Redis业务功能 01、限制玩家积分的每日重置次数
SpringBoot集成Redis业务功能 01、限制玩家积分的每日重置次数
SpringBoot集成Redis业务功能 01、限制玩家积分的每日重置次数
|
SQL 存储 NoSQL
使用Redis实现用户积分及TopN排行榜功能
需求:添加积分 在用户签到的基础上添加用户积分,签到 1 天送 10 积分,连续签到 2 天送 20 积分,3 天送 30 积分,4 天以上均送 50 积分。 积分排行榜
443 0
使用Redis实现用户积分及TopN排行榜功能
|
XML NoSQL Java
基于Redis实现在线游戏积分排行榜-2
基于Redis实现在线游戏积分排行榜-2
198 0
|
NoSQL Java Maven
基于Redis实现在线游戏积分排行榜-1
基于Redis实现在线游戏积分排行榜-1
229 0
|
存储 弹性计算 NoSQL
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
基于Redis实现在线游戏积分排行榜
|
Cloud Native 定位技术 图形学
《2022中国云游戏行业认知与观察》——前言
《2022中国云游戏行业认知与观察》——前言
138 0
|
存储 Cloud Native Android开发
《2022中国云游戏行业认知与观察》——第一章、了解云游戏——1.1 什么是云游戏?(上)
《2022中国云游戏行业认知与观察》——第一章、了解云游戏——1.1 什么是云游戏?(上)
251 0
|
Web App开发 边缘计算 编解码
《2022中国云游戏行业认知与观察》——第一章、了解云游戏——1.1 什么是云游戏?(中)
《2022中国云游戏行业认知与观察》——第一章、了解云游戏——1.1 什么是云游戏?(中)
186 0

相关产品

  • 云数据库 Tair(兼容 Redis)