排行榜取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