1. 程式人生 > 資料庫 >基於Redis實現線上遊戲積分排行榜

基於Redis實現線上遊戲積分排行榜

此文轉載自:https://my.oschina.net/u/4542749/blog/4649091
LiteOS Studio圖形化調測能力,物聯網打工人必備!>>>

介紹

本場景將介紹如何基於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資料庫的遊戲玩家積分排行榜功能。 阿里雲 場景資源:(提供真實資源模擬)

步驟一:搭建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實現線上遊戲積分排行榜》,的所有內容了

體驗本次的真實場景,真實環境可至 阿里雲體驗實驗室