Redis-多字段排序-排名设计

本文介绍了如何利用Redis的sorted set实现多字段排序,特别是在用户答题后的排名设计中。通过结合正确率和耗时两个条件,设计了一个分数计算算法,使用位运算将正确率和耗时转化为分数,然后在Redis中进行排序。示例代码使用了SpringBoot、Redisson客户端和Mybatis ORM。更新排名时会检查成绩是否为用户最佳记录。
摘要由CSDN通过智能技术生成

Redis的sorted set集合提供了一种有序的集合,集合中的每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
使用场景通常是作为排名。
在上一篇说了选择题型题目表设计,接着这篇说下用户回答题目后的排行设计,这里使用redis的有序集合进行排名,排名条件是正确率高,耗时少。

有序集合添加元素时需设定一个分数,这里两个排序条件不同,一个按照正确率倒序,一个按照耗时升序,所以需要设计一个分数计算算法。

这里通过位运算进行计算分数,将正确率*100后左移32位,再用Integer.MAX_VALUE-耗时(毫秒),将两者结果进行或运算,这样,正确率越高,耗时越少,分数越高,再反向排名即可。

demo使用springboot框架
redis客户端使用redisson;
orm使用mybatis

model

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

@Data
public class Question {
    private Long id;

    private String title;

    private Date createAt;

    private Long createBy;

    private Integer status;

    private Date updateAt;

    private Long updateBy;

}

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

@Data
public class QuestionAnswer {
    private Long id;

    private Long userId;

    private Long questionId;

    private Long optionId;

    private Long historyId;

    private Integer status;

    private Date updateAt;

    private Long updateBy;

    private Date createAt;

    private Long createBy;

}

package com.example.demo.model;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
public class QuestionAnswerHistory implements Serializable {
    private Long id;

    private Long userId;

    private Boolean answerFinish;

    private Double correctRate;

    private Integer timeConsumed;

    private Integer status;

    private Date createAt;

    private Long createBy;

    private Integer createAtMillisecond;

    private Date updateAt;

    private Long updateBy;

    private Integer updateAtMillisecond;

    private Integer timeConsumedMillisecond;

}

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

@Dat
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值