云数据库Redis兼容开源Redis,本文通过简单的示例,为您演示通过云数据库Redis实现在线游戏中的积分排行榜功能。
体验开发者云实验室
您可以通过开发者云实验室,免费获取一台配置了CentOS 7.7的ECS实例(云服务器)和一个Redis 5.0数据库实例,根据云实验室的教程,使用Java语言实现基于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(); } } }