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


    此文转载自:https://my.oschina.net/u/4542749/blog/4649091

    介绍

    本场景将介绍如何基于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,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。排行榜是有序集合的经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

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

    场景体验

    提供一台配置了CentOS 7.7的ECS实例(云服务器)和一个Redis 5.0数据库实例。通过本教程的操作,您可以使用Java语言实现基于Redis数据库的游戏玩家积分排行榜功能。 阿里云 场景资源:(提供真实资源模拟) https://developer.aliyun.com/adc/scenario/44d54481170f4914996d3ae53b818f32

    步骤一:搭建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打开镜像仓库配置文件。

    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编辑器。

    添加阿里云镜像仓库配置如下图所示: 在这里插入图片描述

    步骤二:开发游戏玩家积分排行榜功能

    操作步骤:

    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密码 。

    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.使用maven打包项目。

    mvn assembly:assembly
    

    出现如下日志时表示打包成功: 在这里插入图片描述

    1. 运行jar文件。
    java -jar target/demo-0.0.1-SNAPSHOT.jar
    

    运行结果如下所示: 在这里插入图片描述 以上就是《基于Redis实现在线游戏积分排行榜》,的所有内容了

    体验本次的真实场景,真实环境可至 阿里云体验实验室 https://developer.aliyun.com/adc/labs/

       

    更多内容详见微信公众号:Python测试和开发

    Python测试和开发

  • 相关阅读:
    VScode出现无法打开“X”: 找不到文件(file:///XXXX) 的解决办法
    Re:0通过服务器自建内网穿透远程桌面(10分钟可完成)
    (补题 POJ 3013) Big Christmas Tree
    (补题 cf 1140)Detective Book
    (2019.9.5~2019.9.11)补题汇总(字符串相关)
    最小生成树(克鲁斯卡尔算法)
    最短路问题
    字符串匹配(部分整理)
    Linux内核分析——第八周学习笔记
    《Linux内核设计与实现》第四章读书笔记
  • 原文地址:https://www.cnblogs.com/phyger/p/14190194.html
Copyright © 2020-2023  润新知