云数据库Redis兼容开源Redis,本文通过简单的示例,为您演示通过云数据库Redis实现在线游戏中的积分排行榜功能。
环境说明
云产品 | 说明 |
---|---|
ECS实例 |
|
Redis实例 | 网络类型为专有网络,且与ECS实例属于同一专有网络。 |
说明 如果Redis实例与ECS的专有网络不同,您可以更换Redis实例的专有网络,具体操作,请参见更换专有网络VPC或交换机;如果网络类型不同,解决方法请参见ECS实例与Redis实例的网络类型不同时如何连接。
操作步骤
执行结果
示例代码注释
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 = "r-gs50a75e1968****.redis.hangzhou.rds.aliyuncs.com";
int port = 6379;
Jedis jedis = new Jedis(host, port);
try {
//实例密码
String authString = jedis.auth("Pass!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中获取已经排好序的玩家列表
Set<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();
}
}
}