小白新手基于云数据库 Redis 搭建 游戏排行榜
  • 免费试用
  • 搭建游戏排行榜
  • 搭建基础环境JDK、Maven
  • 部署游戏排行榜
  • 写在最后
  • 操作感受
  • 其他应用


免费试用

在开始搭建游戏排行榜之前,我们首先需要领取阿里云社区为我们准备的免费资源,比如云数据库 Redis 版 免费试用

小白新手基于云数据库 Redis 搭建 游戏排行榜_游戏


点击【立即试用】弹窗试用页面,注意这里需要选择【杭州可用区I】,专有网络选择第一个,虚拟交换机会自动选中的

小白新手基于云数据库 Redis 搭建 游戏排行榜_游戏_02


剩下的都不用动,默认即可,滑到开通服务页面的最下端

小白新手基于云数据库 Redis 搭建 游戏排行榜_数据库_03


勾选协议,点击【立即试用】即可免费开通云数据库 Redis 版。

搭建游戏排行榜

开通了云数据库Redis版服务之后就可以基于Redis搭建游戏排行榜了,实验室地址:基于Redis实现在线游戏积分排行榜,实验室首页

小白新手基于云数据库 Redis 搭建 游戏排行榜_游戏_04


点击【立即开始】

搭建基础环境JDK、Maven

安装JDK
安装OpenJDK 1.8,执行命令

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

安装完成后执行命令查看是否安装成功

java -version
  • 1.

小白新手基于云数据库 Redis 搭建 游戏排行榜_Redis_05


安装Maven

下载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
  • 1.

解压Maven安装包到指定/user/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
  • 1.

添加Maven启动命令到环境变量中

echo "export PATH=$PATH:/usr/local/maven/bin" >> /etc/profile

source /etc/profile
  • 1.
  • 2.
  • 3.

配置Maven镜像仓库地址

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

添加镜像仓库地址

<mirror>

       <id>nexus-aliyun</id>

       <mirrorOf>central</mirrorOf>

       <name>Nexus aliyun</name>

       <url>http://maven.aliyun.com/nexus/content/groups/public</url>

</mirror>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

小白新手基于云数据库 Redis 搭建 游戏排行榜_游戏_06

部署游戏排行榜

创建demo文件夹并切换到demo文件夹下

mkdir -p demo/src/main/java/test/ && cd demo
  • 1.

创建并编辑Java类文件GameRankSample.java

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

粘贴提前准备好的测试代码内容

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();

        }

    }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.

代码中host需要替换为:Redis的内网地址

password需要替换为:Redis密码

小白新手基于云数据库 Redis 搭建 游戏排行榜_游戏_07


替换完成之后创建pom.xml文件

vim pom.xml
  • 1.

粘贴pom.xml内容

<?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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.

执行Maven打包命令

mvn clean package assembly:single -DskipTests
  • 1.

通过java -jar命令运行类

java -classpath target/demo-0.0.1-SNAPSHOT.jar test.GameRankSample
  • 1.

运行结果如图

小白新手基于云数据库 Redis 搭建 游戏排行榜_排行榜_08


到这里我们基于云数据库Redis 版搭建实时在线游戏积分榜的操作就完成了,实验的结果也很有效果。

写在最后

操作感受

虽然我们这次是基于实验室的基础上进行的云数据库Redis的操作,但是我们从另一个方面可以看到Redis在获取排序数据时的效率,整个过程中代码命令也很简单,只需一个命令jedis.zrevrangeWithScores(key, 0, -1) 即可以获取到排好序的玩家信息,无需进行过多的操作即可达到目的,从实用性和操作性上很简单,学习成本比较低,更容易尽快的融入业务系统中去。整个操作过程比较流畅,没有卡顿,只是在进行Maven解压及重命名操作过程中,实验室提供的命令版本号是错误的,修改后即可,其他的操作命令整体上和平时用的无异,操作顺畅,没有问题。

其他应用

作为云数据库Redis版,那么现下的公司用的开源的Redis都可以用云数据库Redis版来替代的,不但可以省去大量的运维成本,还可以获得更好的NoSQL体验;另外作为内存级数据库,可以作为缓存加速应用访问,比如缓存登录信息,或者缓存访问量较大且不易变化的通知信息等。另外在电商场景的秒杀场景,云数据库Redis版可以直接用来缓存秒杀数据,提高响应效率,提高服务的稳定性等。