Skip to Content
产品应用应用场景排行榜取TOP N

排行榜取TOP N

游戏服务器中涉及到很多排行信息,取TOP N操作,比如玩家等级排名、金钱排名、战斗力排名等,虽然通过关系数据库也可以实现,但是随着数据量增多,数据库的排序压力就会变大。

这些操作对于Redis来说都很简单,即使你有几百万个用户,每分钟都会有几百万个新的得分。

只需要jedis.zrevrank(key,member);

import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import redis.clients.jedis.Jedis; import redis.clients.jedis.Tuple; public class HelloWorldApp { static int TOTAL_SIZE = 10000; //获取长度为8,由小写字母组成的随机名称 public static String randomName(int length) { StringBuilder builder = new StringBuilder(length); for (int i = 0; i < length; i++) { builder.append((char) ThreadLocalRandom.current().nextInt(97,122));//a~z } return builder.toString(); } public static void main(String[] args) { //连接信息,从控制台可以获得 String host = "127.0.0.1"; int port = 10011; Jedis jedis = new Jedis(host, port); //排行榜应用,取TOP N操作 try { //Key(键) String key = "游戏排行榜!"; //清除可能的已有数据 jedis.del(key); //模拟生成若干个游戏选手 List<String> playerList = new ArrayList<String>(); for (int i = 0; i < TOTAL_SIZE; ++i) { //随机生成每个选手的名称 playerList.add(randomName(8)); } System.out.println("输入全部" + TOTAL_SIZE +" 选手 "); //记录每个选手的得分 for (int i = 0; i < playerList.size(); i++) { //随机生成数字,模拟选手的游戏得分 int score = (int)(Math.random()*5000); String member = playerList.get(i); if (i < 10) { System.out.println("选手名称:" + member + ", 选手得分: " + score ); } //将选手的名称和得分,都加到对应key的SortedSet中去 jedis.zadd(key, score, member); } System.out.println("更多选手得分......"); //从对应key的SortedSet中获取已经排好序的选手列表 Set<Tuple> scoreList = jedis.zrevrangeWithScores(key, 0, -1); //输出打印Top100选手排⾏行榜 System.out.println(); System.out.println(" "+key); System.out.println(" Top 100 选手"); scoreList = jedis.zrevrangeWithScores(key, 0, 99); for (Tuple item : scoreList) { System.out.println("选手名称:"+item.getElement()+", 选手得分:"+Doubl e.valueOf(item.getScore()).intValue()); } //输出某个选手的排名 String player = playerList.get(0); System.out.println(); System.out.println(" "+key); System.out.println(" 选手"+player+"的排名: "+ jedis.zrevrank(key,player)); } catch (Exception e) { e.printStackTrace(); }finally{ jedis.quit(); jedis.close(); } } }

输出:

输入全部10000 选手 选手名称:hegmsrcs, 选手得分: 1191 选手名称:ocvhhxke, 选手得分: 653 选手名称:ekgdllwj, 选手得分: 694 选手名称:kxwsnnjj, 选手得分: 2051 选手名称:vjflcktn, 选手得分: 2100 选手名称:jtrlmnlk, 选手得分: 4257 选手名称:aatbchgk, 选手得分: 2912 选手名称:phukvvxy, 选手得分: 2044 选手名称:aqqdqnel, 选手得分: 1859 选手名称:hyndvsen, 选手得分: 2381 更多选手得分...... 游戏排行榜! Top 100 选手 选手名称:kqyhxehe, 选手得分:4999 选手名称:datnveli, 选手得分:4998 选手名称:ovxfislm, 选手得分:4997 选手名称:llqnigun, 选手得分:4997 选手名称:ckikmasa, 选手得分:4997 选手名称:wlmdrpnx, 选手得分:4996 选手名称:trslhgga, 选手得分:4996 选手名称:bkbfnutg, 选手得分:4996 选手名称:yqesafda, 选手得分:4995 选手名称:grtjbjrq, 选手得分:4995 更多选手排名...... 游戏排行榜! 选手hegmsrcs的排名: 7618