Redis实现排行榜(按正确率和交卷时间排序)

96
Stalary
2018.08.12 17:29* 字数 327

排行榜因为即时性的要求,所以我们一般会使用Redis,下面就来详细讲一下Redis在帮行榜中的具体应用。

首先确定数据结构的使用。Redis的数据结构有String,Hash,List,Set,SortedSet等,而带有自动排序的则是SortedSet。

因为需要按照正确率和交卷时间排序,但是正确率是要占较大权重的,所以我们有两种方案存储方案

  1. zadd top rate userId & hset top userId submitTime
  2. zadd top rate+submitTime userId

可以看出如果使用第一种方案,我们需要存储两个映射,所以我选择了第二种方法,而socre需要进行处理。

score=Double.valueOf(rate + "" + (future - submitTime))

因为提交时间越晚会越大,所以需要用未来的时间减去提交时间,才会使提交越早的排序越高,我选择的是13位的9999999999999L。

下面我们来查询一下前十名

zrevrange test1 0 9 withscores

返回结果.png

可以发现user7和user10,正确率相同都是100%,但是user10提交较晚所以排在了后面,所以我们得到了想要的结果。

读取时如果需要正确率,则加一个转化函数即可

    public String score2Rate(double score) {
        String scoreStr = String.valueOf((long) score);
        return scoreStr.substring(0, scoreStr.length() - 13);
    }
技术文章
Web note ad 1