游戏玩家积分排行榜

更新时间: 2023-09-01 14:09:33

kvstore

手动配置

教程简介

本教程以通过公网连接Redis实例为例,指导您如何快速创建云数据库Redis版实例并搭建常见的游戏玩家积分排行榜。您也可以将应用部署在与Redis相同VPC的ECS实例上,并通过专有网络访问Redis实例,以获得更高的安全性和更低的网络延迟。

游戏行业通常将Redis作为重要的部署架构组件,用于缓存或数据持久化。云数据库Redis版是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。

我能学到什么

  • 如何创建Redis实例。

  • 使用Redis实例搭建常见的游戏玩家积分排行榜。

操作难度

所需时间

25分钟

使用的阿里云产品

云数据库Redis版

所需费用

若您满足试用条件,则为0元,若不满足,在创建Redis实例时将会产生费用。

准备环境和资源

5

开始教程前,请按以下步骤准备环境和资源:

  1. 准备如下开发环境。

    • 开发工具:IntelliJ IDEA 2022.3.2及以上版本,本教程以Windows系统的IntelliJ IDEA 2022.3.2版为例。macOS系统的操作与本文类似。

    • Java:Java 1.8.0及以上版本,本教程以Java 1.8.0版为例。

  2. 访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(根据试用产品要求完成个人实名认证或企业实名认证)。

  3. 成功登录后,在产品类别下选择数据库>NoSQL 数据库,选择云数据库Redis版,单击立即试用

  4. 云数据库Redis版面板,配置以下信息。

    配置项

    说明

    示例

    地域

    实例的地域。请根据您所在的地理位置就近选择地域,实例将创建在该地域,创建后无法变更地域。

    若需通过ECS连接该Redis实例,请确保Redis实例与ECS实例为同地域,否则它们无法通过内网互通,只能通过外网连接,无法发挥最佳性能。

    华东1(杭州)

    可用区类型

    • 单可用区:主备节点都会部署在单一可用区,适合可用区灾备级别的要求为单机房的场景。

    • 双可用区:主备节点会分别部署在指定的主可用区和备可用区,组成同城双中心主备架构。

    单可用区

    主可用区

    可用区是指在同一地域内,电力和网络互相独立的物理区域。

    当选择可用区类型双可用区时,您还需要指定备可用区,且备可用区需要与主可用区不同。主备可用区共同组成同城双中心的主备架构。

    杭州 可用区 G

    专有网络

    选择实例的专有网络。如果没有专有网络,系统将自动创建。

    若需通过ECS连接该Redis实例,请确保Redis实例与ECS实例位于同一个专有网络(同VPC ID)。

    自动创建VPC网络

    虚拟交换机

    选择专有网络下的虚拟交换机(vSwitch)。如果该专有网络下在当前可用区中没有交换机,系统将自动创建。

    自动创建虚拟交换机

    版本

    推荐使用较新的Redis引擎版本,以支持更多的功能和特性。

    Redis 6.0

    版本类型实例类型架构类型分片规格读写分离副本数只读副本分片数量等实例配置项保持默认值。

  5. 选择密码设置立即设置,输入密码和确认密码。

  6. 输入实例名称(可选)。

    名称为2~80个字符,以大小写字母或中文开头,不支持字符:@/:=”<>{[]}与空格。

  7. 试用时长固定为1个月

  8. 选择实例所属的资源组为默认资源组

  9. 阅读并选中服务协议,单击立即试用

    创建实例需要1~5分钟。您可以在Redis控制台实例列表中,选择实例所属的地域,即可看到新购买的Redis实例。

设置白名单

3

Redis实例默认禁止所有IP地址访问,在开始使用前,请将客户端的IP地址或IP地址段添加到Redis实例的白名单中。

  1. Redis控制台实例列表页面左上方选择创建实例的地域,例如华东1(杭州),然后单击目标实例ID。

  2. 在左侧导航栏,单击白名单设置

  3. default默认白名单分组,单击修改

  4. 组内白名单文本框中,输入本地设备的公网IP地址。

    获取本地设备公网IP地址的方式可能因你所处的网络环境或操作不同而不同。以下是不同系统通过命令方式获取本地设备公网IP地址的参考方法:

    • Linux操作系统:打开终端,输入curl ifconfig.me命令后回车。

    • Windows操作系统:打开命令提示符,输入curl ip.me命令后回车。

    • macOS操作系统:打开终端,输入curl ifconfig.me命令后回车。

  5. 单击确定

获取Redis连接地址

2

Redis实例默认提供专有网络连接地址,由于本教程通过公网连接Redis实例,因此需要在连接前获取Redis实例的公网连接地址,申请公网地址和后续产生的公网流量暂不收费。

  1. 在左侧导航栏,单击实例信息

  2. 连接信息区域框,单击公网访问对应的申请连接地址

  3. 单击确定

    申请操作完成后,刷新控制台页面,连接信息区域框中将展示公网连接地址。

执行代码

10

参考如下步骤创建工程,您也可以下载GameRankTest源文件,下载后可跳过下面的步骤1~4,直接参考本步骤5修改Redis实例信息。

  1. 在本地设备,运行IDEA客户端。

  2. 新建一个Project。

    参数说明:

    • Name:项目名称,示例为GameRankTest。

    • Location:项目存储路径,示例为D:\Test\JAVA\

    • Language:开发语言,选择Java。

    • Build system:编译系统,选择Maven。

    • JDK:开发工具包,选择1.8 Oracle OpenJDK version 1.8.0_261或Java 1.8其他版本。

    • Add sample code:是否加载示例。本教程勾选Add sample code

    游戏玩家排行榜新建project
  3. 在pom.xml文件中,添加Maven依赖。

        <dependencies>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>4.2.3</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.25</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
  4. 右键单击pom.xml文件,选择Maven > Reload project

  5. src > main > java > org.example路径下,新建一个Java Class,命名为GameRankSample,并添加示例代码。

    将示例代码中的Redis实例连接地址、端口号以及账号密码修改为您的Redis实例信息。

    参数说明:

    • host:获取的Redis实例公网连接地址。

    • port:Redis实例的端口号,默认为6379,无需修改。

    • authString:Redis实例的账号与密码,可直接填写创建实例时设置的密码(将通过默认账号进行登录)。若创建实例时未配置密码,请参见修改或重置密码。如果创建了新的账号,并希望使用新账号连接Redis实例,则账号密码格式为user:password

    package org.example;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.resps.Tuple;
    
    public class GameRankSample {
    
        static int TOTAL_SIZE = 20;
    
        public static void main(String[] args) {
            // 连接地址,可通过Redis控制台获取。
            String host = "r-bp************.redis.rds.aliyuncs.com";
    
            int port = 6379;
            Jedis jedis = new Jedis(host, port);
            try {
                // 实例密码。
                String authString = jedis.auth("D****123"); //password
                if (!authString.equals("OK")) {
                    System.err.println("AUTH Failed: " + authString);
                    return;
                }
                // Key(键)
                String key = "Game name: Keep Running, Alibaba Cloud!";
                // 清除可能的已有数据。
                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("Inputs all players ");
                // 记录每个玩家的得分。
                for (int i = 0; i < playerList.size(); i++) {
                    // 随机生成数字,模拟玩家的游戏得分。
                    int score = (int) (Math.random() * 5000);
                    String member = playerList.get(i);
                    System.out.println("Player ID:" + member + ", Player Score: " + score);
                    // 将玩家ID和分数添加到相应键的SortedSet中。
                    jedis.zadd(key, score, member);
                }
                // 输出打印全部玩家排行榜。
                System.out.println();
                System.out.println("       " + key);
                System.out.println(" Ranking list of all players");
                // 从对应key的SortedSet中获取已经排好序的玩家列表。
                List<Tuple> scoreList = jedis.zrevrangeWithScores(key, 0, -1);
                for (Tuple item : scoreList) {
                    System.out.println(
                            "Player ID:" +
                                    item.getElement() +
                                    ", Player Score:" +
                                    Double.valueOf(item.getScore()).intValue()
                    );
                }
                // 输出打印前五名玩家的信息。
                System.out.println();
                System.out.println("       " + key);
                System.out.println("       Top players");
                scoreList = jedis.zrevrangeWithScores(key, 0, 4);
                for (Tuple item : scoreList) {
                    System.out.println(
                            "Player ID:" +
                                    item.getElement() +
                                    ", Player Score:" +
                                    Double.valueOf(item.getScore()).intValue()
                    );
                }
                // 输出打印特定玩家列表。
                System.out.println();
                System.out.println("         " + key);
                System.out.println(" Players with scores from 1,000 to 2,000");
                // 从对应key的SortedSet中获取已经积分在1000至2000的玩家列表。
                scoreList = jedis.zrangeByScoreWithScores(key, 1000, 2000);
                for (Tuple item : scoreList) {
                    System.out.println(
                            "Player ID:" +
                                    item.getElement() +
                                    ", Player Score:" +
                                    Double.valueOf(item.getScore()).intValue()
                    );
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                jedis.quit();
                jedis.close();
            }
        }
    }
  6. 右键单击GameRankSample,单击run图标,运行示例代码。

完成

2

运行结果示例如下。

Inputs all players 
Player ID:2f145776-34a3-4585-abaa-95c6bdcc622d, Player Score: 3690
Player ID:4cc1a9a0-815e-42bd-8bbd-41fc0760d5bd, Player Score: 2038
Player ID:f12097f9-0a0f-4f33-b1e3-b553d2d745bd, Player Score: 1307
Player ID:5f380389-d1a1-4306-89d8-b8c7f016a043, Player Score: 1621
Player ID:880ff07d-0b2b-476d-808b-4ab84f391ac2, Player Score: 4192
Player ID:93b31545-f075-4a61-a52b-4329b5a661d8, Player Score: 3532
Player ID:becb6828-81a3-46b8-b679-c006b4d46a13, Player Score: 4456
Player ID:2d2186a0-8e8b-45ff-9ebc-866a3b5a899f, Player Score: 2282
Player ID:9126f0e9-f0ec-4e0f-a5de-7d455e142e04, Player Score: 111
Player ID:d831b9f4-1a24-4c06-95cd-cb8745094468, Player Score: 4611
Player ID:11e41d03-0704-4336-bcda-8922114e5c9c, Player Score: 1659
Player ID:fd6bb641-fca5-47cb-b1b7-8dba5ed1a455, Player Score: 75
Player ID:aae42046-dbbd-4bcd-9563-49e25d4c8058, Player Score: 3653
Player ID:f8feed0a-8be4-4809-b751-aa5d5b7ceb97, Player Score: 3462
Player ID:c99da41e-e9e5-4f44-822d-f6f3f19bf84b, Player Score: 423
Player ID:c981af6d-4d2c-4fe3-ae96-8f6c21b00dc4, Player Score: 2075
Player ID:e00fa3b4-2530-4a64-8df4-63dc9cf9f5b9, Player Score: 3240
Player ID:7134efd2-994d-4105-913f-926d6e53c8b1, Player Score: 1268
Player ID:3e9ae213-6bee-4cc2-b92f-c69b0e3d0944, Player Score: 3281
Player ID:18cfd8a9-8e54-4b93-af02-501a71efa766, Player Score: 265

       Game name: Keep Running, Alibaba Cloud!
 Ranking list of all players
Player ID:d831b9f4-1a24-4c06-95cd-cb8745094468, Player Score:4611
Player ID:becb6828-81a3-46b8-b679-c006b4d46a13, Player Score:4456
Player ID:880ff07d-0b2b-476d-808b-4ab84f391ac2, Player Score:4192
Player ID:2f145776-34a3-4585-abaa-95c6bdcc622d, Player Score:3690
Player ID:aae42046-dbbd-4bcd-9563-49e25d4c8058, Player Score:3653
Player ID:93b31545-f075-4a61-a52b-4329b5a661d8, Player Score:3532
Player ID:f8feed0a-8be4-4809-b751-aa5d5b7ceb97, Player Score:3462
Player ID:3e9ae213-6bee-4cc2-b92f-c69b0e3d0944, Player Score:3281
Player ID:e00fa3b4-2530-4a64-8df4-63dc9cf9f5b9, Player Score:3240
Player ID:2d2186a0-8e8b-45ff-9ebc-866a3b5a899f, Player Score:2282
Player ID:c981af6d-4d2c-4fe3-ae96-8f6c21b00dc4, Player Score:2075
Player ID:4cc1a9a0-815e-42bd-8bbd-41fc0760d5bd, Player Score:2038
Player ID:11e41d03-0704-4336-bcda-8922114e5c9c, Player Score:1659
Player ID:5f380389-d1a1-4306-89d8-b8c7f016a043, Player Score:1621
Player ID:f12097f9-0a0f-4f33-b1e3-b553d2d745bd, Player Score:1307
Player ID:7134efd2-994d-4105-913f-926d6e53c8b1, Player Score:1268
Player ID:c99da41e-e9e5-4f44-822d-f6f3f19bf84b, Player Score:423
Player ID:18cfd8a9-8e54-4b93-af02-501a71efa766, Player Score:265
Player ID:9126f0e9-f0ec-4e0f-a5de-7d455e142e04, Player Score:111
Player ID:fd6bb641-fca5-47cb-b1b7-8dba5ed1a455, Player Score:75

       Game name: Keep Running, Alibaba Cloud!
       Top players
Player ID:d831b9f4-1a24-4c06-95cd-cb8745094468, Player Score:4611
Player ID:becb6828-81a3-46b8-b679-c006b4d46a13, Player Score:4456
Player ID:880ff07d-0b2b-476d-808b-4ab84f391ac2, Player Score:4192
Player ID:2f145776-34a3-4585-abaa-95c6bdcc622d, Player Score:3690
Player ID:aae42046-dbbd-4bcd-9563-49e25d4c8058, Player Score:3653

         Game name: Keep Running, Alibaba Cloud!
 Players with scores from 1,000 to 2,000
Player ID:7134efd2-994d-4105-913f-926d6e53c8b1, Player Score:1268
Player ID:f12097f9-0a0f-4f33-b1e3-b553d2d745bd, Player Score:1307
Player ID:5f380389-d1a1-4306-89d8-b8c7f016a043, Player Score:1621
Player ID:11e41d03-0704-4336-bcda-8922114e5c9c, Player Score:1659

清理及后续

3

清理

该Redis实例只能免费试用1个月。实例到期后,将在15天后自动释放(数据被删除)。若您需继续使用Redis实例,您可以在该实例被释放前进行手动续费或开启自动续费,具体操作请参见续费实例

后续

您还可以通过Redis实现更多游戏、金融、电商、视频直播类等应用,更多信息请参见什么是云数据库Redis版

总结

常用知识点

问题1:若不将客户端设备的IP地址添加至Redis实例的白名单中,客户端能否正常访问Redis实例?(单选题)

  • 可以

  • 不可以

正确答案是不可以,Redis实例默认拒绝任务IP地址访问,需提前将客户端设备的IP地址添加至Redis实例的白名单中才能正常访问。

延伸阅读

阿里云首页 相关技术圈