redis多字段分页排序

2023-11-05

1、redis有序集合

sorted set 是在 Sets 的基础上增加了分数设置作为排序依据,所以除了具备 Sets 的特性外,还可以进行排序。它提供了一个 score 属性,正好可以用来做排序依据。

2、单字段排序

用户类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
    private Long id;
    private String name;
    /**
     * 创建时间
     *
     * @author: ybw
     * @date: 2023/3/24
     **/
    private LocalDateTime createDateTime;
    /**
     * 积分
     *
     * @author: ybw
     * @date: 2023/3/24
     **/
    private Long point;
}

初始化数据,根据createDateTime排序

public void init() {
    for (long i = 0L; i < 1000L; i++) {
        UserDTO userDTO = new UserDTO(i, "zhangsan" + i, LocalDateTime.now().plusDays(i%500),i);
        // 按时间排序
        redisTemplate.opsForZSet().add(key, userDTO, userDTO.getCreateDateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
    }
}

分页查询

public void page() {
    //页码
    int pageNum = 1;
    //一页条数
    int pageSize = 20;
    int start = (pageNum - 1) * pageSize;
    int end = start + pageSize - 1;
    // 时间从小到大排序
    Set<UserDTO> set = redisTemplate.opsForZSet().range(key, start, end);
    log.info("set:{}", JSON.toJSONString(set));
}

打印日志如下,可以看到createDateTime升序返回的:

[{
    "createDateTime": "2023-03-24T11:01:33.470",
    "id": 0,
    "name": "zhangsan0",
    "point": 0
}, {
    "createDateTime": "2023-03-24T11:01:36.343",
    "id": 500,
    "name": "zhangsan500",
    "point": 500
}, {
    "createDateTime": "2023-03-25T11:01:36.143",
    "id": 1,
    "name": "zhangsan1",
    "point": 1
}, {
    "createDateTime": "2023-03-25T11:01:36.343",
    "id": 501,
    "name": "zhangsan501",
    "point": 501
}, {
    "createDateTime": "2023-03-26T11:01:36.144",
    "id": 2,
    "name": "zhangsan2",
    "point": 2
}, {
    "createDateTime": "2023-03-26T11:01:36.343",
    "id": 502,
    "name": "zhangsan502",
    "point": 502
}, {
    "createDateTime": "2023-03-27T11:01:36.146",
    "id": 3,
    "name": "zhangsan3",
    "point": 3
}, {
    "createDateTime": "2023-03-27T11:01:36.344",
    "id": 503,
    "name": "zhangsan503",
    "point": 503
}, {
    "createDateTime": "2023-03-28T11:01:36.146",
    "id": 4,
    "name": "zhangsan4",
    "point": 4
}, {
    "createDateTime": "2023-03-28T11:01:36.344",
    "id": 504,
    "name": "zhangsan504",
    "point": 504
}, {
    "createDateTime": "2023-03-29T11:01:36.147",
    "id": 5,
    "name": "zhangsan5",
    "point": 5
}, {
    "createDateTime": "2023-03-29T11:01:36.344",
    "id": 505,
    "name": "zhangsan505",
    "point": 505
}, {
    "createDateTime": "2023-03-30T11:01:36.148",
    "id": 6,
    "name": "zhangsan6",
    "point": 6
}, {
    "createDateTime": "2023-03-30T11:01:36.344",
    "id": 506,
    "name": "zhangsan506",
    "point": 506
}, {
    "createDateTime": "2023-03-31T11:01:36.148",
    "id": 7,
    "name": "zhangsan7",
    "point": 7
}, {
    "createDateTime": "2023-03-31T11:01:36.344",
    "id": 507,
    "name": "zhangsan507",
    "point": 507
}, {
    "createDateTime": "2023-04-01T11:01:36.150",
    "id": 8,
    "name": "zhangsan8",
    "point": 8
}, {
    "createDateTime": "2023-04-01T11:01:36.345",
    "id": 508,
    "name": "zhangsan508",
    "point": 508
}, {
    "createDateTime": "2023-04-02T11:01:36.152",
    "id": 9,
    "name": "zhangsan9",
    "point": 9
}, {
    "createDateTime": "2023-04-02T11:01:36.345",
    "id": 509,
    "name": "zhangsan509",
    "point": 509
}]

3、多字段排序

sorted set可以通过score进行单字段排序,如果是多字段排序,如下面的sql,如何实现呢?

select * from user order by score desc,name desc;

3.1 按创建时间升序、积分降序

UserDTO不变、page(分页查询)不变,修改初始化代码。

限制条件:用户积分不能超过1000。代码实现

  • createDateTime在高位。

  • point在低位,用1000-point达到降序的效果。

public void init() {
    for (long i = 0L; i < 1000L; i++) {
        UserDTO userDTO = new UserDTO(i, "zhangsan" + i, LocalDateTime.now().plusDays(i % 500).with(LocalTime.MIN), i);
        //积分不超过1000
        Long pointLimit=1000L;
        // 按时间升序、积分降序
        double score = userDTO.getCreateDateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()*pointLimit + (pointLimit - userDTO.getPoint());
        redisTemplate.opsForZSet().add(key, userDTO, score);
    }
}

分页查询日志,在createDateTime相同的情况下,按point降序排列。

[{
    "createDateTime": "2023-03-24T00:00:00",
    "id": 500,
    "name": "zhangsan500",
    "point": 500
}, {
    "createDateTime": "2023-03-24T00:00:00",
    "id": 0,
    "name": "zhangsan0",
    "point": 0
}, {
    "createDateTime": "2023-03-25T00:00:00",
    "id": 501,
    "name": "zhangsan501",
    "point": 501
}, {
    "createDateTime": "2023-03-25T00:00:00",
    "id": 1,
    "name": "zhangsan1",
    "point": 1
}, {
    "createDateTime": "2023-03-26T00:00:00",
    "id": 502,
    "name": "zhangsan502",
    "point": 502
}, {
    "createDateTime": "2023-03-26T00:00:00",
    "id": 2,
    "name": "zhangsan2",
    "point": 2
}, {
    "createDateTime": "2023-03-27T00:00:00",
    "id": 503,
    "name": "zhangsan503",
    "point": 503
}, {
    "createDateTime": "2023-03-27T00:00:00",
    "id": 3,
    "name": "zhangsan3",
    "point": 3
}, {
    "createDateTime": "2023-03-28T00:00:00",
    "id": 504,
    "name": "zhangsan504",
    "point": 504
}, {
    "createDateTime": "2023-03-28T00:00:00",
    "id": 4,
    "name": "zhangsan4",
    "point": 4
}, {
    "createDateTime": "2023-03-29T00:00:00",
    "id": 505,
    "name": "zhangsan505",
    "point": 505
}, {
    "createDateTime": "2023-03-29T00:00:00",
    "id": 5,
    "name": "zhangsan5",
    "point": 5
}, {
    "createDateTime": "2023-03-30T00:00:00",
    "id": 506,
    "name": "zhangsan506",
    "point": 506
}, {
    "createDateTime": "2023-03-30T00:00:00",
    "id": 6,
    "name": "zhangsan6",
    "point": 6
}, {
    "createDateTime": "2023-03-31T00:00:00",
    "id": 507,
    "name": "zhangsan507",
    "point": 507
}, {
    "createDateTime": "2023-03-31T00:00:00",
    "id": 7,
    "name": "zhangsan7",
    "point": 7
}, {
    "createDateTime": "2023-04-01T00:00:00",
    "id": 508,
    "name": "zhangsan508",
    "point": 508
}, {
    "createDateTime": "2023-04-01T00:00:00",
    "id": 8,
    "name": "zhangsan8",
    "point": 8
}, {
    "createDateTime": "2023-04-02T00:00:00",
    "id": 509,
    "name": "zhangsan509",
    "point": 509
}, {
    "createDateTime": "2023-04-02T00:00:00",
    "id": 9,
    "name": "zhangsan9",
    "point": 9
}]

4、源代码

https://gitee.com/xixingzhe2/share/tree/master/redis/redis-page

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis多字段分页排序 的相关文章

随机推荐

  • 华为云服务器无法ssh连接&&可以公网ip访问

    基本是SSH服务没有打开的原因 在华为的配置里面默认打开了22号端口 但是需要修改ssh配置文件 首先从华为云服务管理界面远程登录进去 然后会看到 然后登陆之后修改ssh的配置文件 sudo vi etc ssh sshd config 将
  • Scrapy 爬虫完整案例—从小白到大神(银行网点信息为例)

    采用selenium界面抓取信息 需要渲染界面 并且也是单线程操作 效率极低 一晚上只爬去了一个工行的数据 突然想到了分布式爬虫 安装 Scrapy pip版本过于老旧不能使用 需要升级pip版本 输入python m pip instal
  • OpenCV学习三十三:pointPolygonTest 检测点是否在轮廓内

    opencv函数 pointPolygonTest C double pointPolygonTest InputArray contour Point2f pt bool measureDist 用于测试一个点是否在多边形中 当measu
  • 云计算知识点

    一 理解云计算 一 云计算的基本概念 1 定义 云计算是以服务的形式 按需向用户提供计算资源的一种模式 它是分布式计算的一种特殊形式 引入了效用模型来远程供给可扩展和可测量的资源 2 基本要点 提供IT资源 包括计算 存储以及网络资源 提供
  • 用MATLAB实现雅克比迭代、高斯-赛德尔迭代以及超松弛迭代

    文章目录 前言 一 解线性方程组的方法 二 解线性方程组的迭代法及其代码实现 1 迭代法的收敛性 2 基本参数设置 3 雅克比 Jacobi 迭代 4 高斯 塞德尔 Gauss Seidel 迭代 5 超松弛 SOR 迭代 总结 前言 近期
  • 在opencv3中的机器学习算法

    在opencv3 0中 提供了一个ml cpp的文件 这里面全是机器学习的算法 共提供了这么几种 1 正态贝叶斯 normal Bayessian classifier 我已在另外一篇博文中介绍过 在opencv3中实现机器学习之 利用正态
  • 线性回归实现人脸识别——ORL数据集

    今天写一个比较简单的机器学习例子 使用线性回归实现人脸识别 使用的数据集是ORL数据集 算法描述 输入 图片矩阵img 标签信息label 测试图片test 对每一个类 第一步 从图片矩阵中读出来一类图片 划分为训练集 X 与测试集 y 第
  • 求 1-10 的奇数之积,偶数之和。

    i 1 even sum 0 偶数 odd sum 0 奇数 while i lt 10 循环10次 if i 2 0 even sum even sum i else odd sum odd sum i i 1 print 1 10偶数之
  • React-从0到1搭建一个React项目(一)

    文章目录 架构介绍 第三方组件库 项目准备 环境准备 使用create react app初始化项目 创建项目目录结构 安装第三方库 利用工作之余的时间学习了react 今年一回来 部门要在公众号上面开发一个积分商城 于是准备让我用reac
  • 嵌入式Linux设置开机自动运行程序(基于BusyBox init)

    文章目录 目的 BusyBox init启动流程 inittab rcS 和 rcK 设置开机自动运行程序 总结 目的 开机自动运行程序 或者说系统启动时自动运行程序 这是经常会需要用到的功能 这个功能通常依托于 init 程序实现 ini
  • Log4Net记录日志级别

    level 中的级别 表示记录那些情况下的日志
  • 安装Catia显示无法启动服务器,win10catia r20应用程序无法正常启动的解决办法

    catia r20是一款用于模具设计的专业软件 能够给用户提供十分完善的建模技术 但近日有用户却反映说自己的win10正式版电脑出现了catia r20无法正常启动的情况 那我们要怎么解决这一问题呢 下面小编就来为大家分享关于win10ca
  • spring cloud系列学习(十一、额外篇-建多模块项目-maven的聚合和继承)

    一个项目有很多模块 每个模块都会用到一些公共的依赖 这些公共的依赖若交由各个模块独自管理 若每个模块同一个依赖的版本号不一致 会造成很比问题 打包和开发测试环境下对同一jar包不同版本号的处理可能不一致 造成运行时和测试时结果不一致项目升级
  • Retrofit 接收字符串

    在Retrofit1 9中 GsonConverter是默认包含在包里面的并且会在RestAdapter创建的时候自动创建 结果就是 如果返回的是Json字符串将会自动地被转换为数据存取对象Data Access Object DAO 但是
  • Android 屏幕适配方案

    http blog csdn net lmj623565791 article details 45460089
  • 【元宇宙】临界质量,元宇宙的关键要素

    考虑到电气化和移动技术的普及过程 我们可以自信地说 元宇宙不会突然到来 同时 也不会有明确的 元宇宙之前 beforeMetaverse 和 元宇宙之后 afterMetaverse 阶段一它们只是对应着生活发生改变的历史时期 一些高管认为
  • 面向对象----类变量小坑

    先看一段代码 class A name a def init self pass a A print a name print 10 b A b name b print b name print a name print 10 c A c
  • 开发一个自定义“套壳“浏览器的开源方案--TlC_Browser

    目录 一 项目概述 二 技术选型 三 项目介绍 项目名称 TlC Browser 开发语言 VB6 浏览器内核 webview2 项目目的 在vb6调用h5 实现自定义的浏览器 参考资料 https github com sysdzw We
  • stable-diffusion-webui Restore faces Error

    stable diffusion webui Restore faces Error https github com AUTOMATIC1111 stable diffusion webui issues 1513 我认为这与损坏的安装有
  • redis多字段分页排序

    1 redis有序集合 sorted set 是在 Sets 的基础上增加了分数设置作为排序依据 所以除了具备 Sets 的特性外 还可以进行排序 它提供了一个 score 属性 正好可以用来做排序依据 2 单字段排序 用户类 Data N