體驗簡介
本場景将提供一台
配置了CentOS 7.7的ECS執行個體(雲伺服器)和一個Redis 5.0資料庫執行個體。通過本教程的操作,您可以使用Java語言實作基于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加密,更安全。
步驟一:搭建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 ,搜尋并跳轉到 标簽的位置。
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
出現如下日志時表示打包成功:
- 運作jar檔案。
java -jar target/demo-0.0.1-SNAPSHOT.jar
運作結果如下所示: