分页优化之——游标分页
游标分页(Cursor-based Pagination) 是一种高效的分页方式,特别适用于大数据集和无限滚动的场景。与传统的基于页码的分页(如 page=1&size=10)不同,游标分页通过一个唯一的游标(通常是时间戳或唯一 ID)来标记分页的位置,避免了传统分页在数据变动时的重复或遗漏问题。
以下是游标分页在前后端的实现方式:
1. 游标分页的核心概念
-
游标(Cursor):
-
游标是一个唯一标识符,通常是数据的某个字段(如
id或created_at)。 -
游标用于标记分页的起始位置。
-
-
分页方向:
-
向前分页(Next Page):获取游标之后的记录。
-
向后分页(Previous Page):获取游标之前的记录。
-
-
响应结构:
-
返回分页数据时,需要包含下一个游标和上一个游标,以便客户端继续分页。
-
2. 后端实现
2.1 数据库查询
假设数据表结构如下:
CREATE TABLE posts (id BIGINT PRIMARY KEY AUTO_INCREMENT,content TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-
向前分页:获取
id > cursor的记录。 -
向后分页:获取
id < cursor的记录。
2.2 后端 API 设计
-
请求参数:
-
cursor:当前游标(可选,首次请求时可以为空)。 -
limit:每页的记录数。 -
direction:分页方向(next或prev,可选)。
-
-
响应结构:
{"data": [], // 当前页的数据"next_cursor": "123", // 下一页的游标"prev_cursor": "456" // 上一页的游标 }
2.3 后端代码实现(Java + Spring Boot)
@RestController
@RequestMapping("/posts")
public class PostController {@Autowiredprivate PostRepository postRepository;@GetMappingpublic ResponseEntity<CursorPageResponse<Post>> getPosts(@RequestParam(required = false) Long cursor,@RequestParam(defaultValue = "10") int limit,@RequestParam(defaultValue = "next") String direction) {List<Post> posts;Long nextCursor = null;Long prevCursor = null;if ("next".equals(direction)) {// 向前分页:获取 id > cursor 的记录posts = postRepository.findByIdGreaterThan(cursor, PageRequest.of(0, limit));if (!posts.isEmpty()) {nextCursor = posts.get(posts.size() - 1).getId();prevCursor = posts.get(0).getId();}} else if ("prev".equals(direction)) {// 向后分页:获取 id < cursor 的记录posts = postRepository.findByIdLessThan(cursor, PageRequest.of(0, limit));if (!posts.isEmpty()) {nextCursor = posts.get(0).getId();prevCursor = posts.get(posts.size() - 1).getId();}} else {// 首次请求,获取最新的记录posts = postRepository.findLatest(PageRequest.of(0, limit));if (!posts.isEmpty()) {nextCursor = posts.get(posts.size() - 1).getId();}}CursorPageResponse<Post> response = new CursorPageResponse<>();response.setData(posts);response.setNextCursor(nextCursor);response.setPrevCursor(prevCursor);return ResponseEntity.ok(response);}
}
3. 前端实现
3.1 首次加载
-
首次加载时,不传递
cursor,获取最新的数据。
fetch('/posts?limit=10').then(response => response.json()).then(data => {console.log(data);// 渲染数据// 保存 next_cursor 和 prev_cursor});
3.2 加载下一页
-
使用
next_cursor请求下一页数据。
fetch(`/posts?cursor=${nextCursor}&limit=10&direction=next`).then(response => response.json()).then(data => {console.log(data);// 渲染数据// 更新 next_cursor 和 prev_cursor});
3.3 加载上一页
-
使用
prev_cursor请求上一页数据。
fetch(`/posts?cursor=${prevCursor}&limit=10&direction=prev`).then(response => response.json()).then(data => {console.log(data);// 渲染数据// 更新 next_cursor 和 prev_cursor});
4. 游标分页的优点
-
高效:
-
基于游标的分页可以利用索引,查询性能更高。
-
-
稳定性:
-
数据变动时(如新增或删除记录),游标分页不会出现重复或遗漏问题。
-
-
适合无限滚动:
-
无限滚动场景下,游标分页比传统分页更自然。
-
5. 游标分页的缺点
-
不支持随机跳页:
-
游标分页只能按顺序加载下一页或上一页,无法直接跳转到指定页码。
-
-
实现复杂度较高:
-
需要前后端协同设计游标逻辑。
-
6. 总结
-
游标分页 是一种高效且稳定的分页方式,特别适合大数据集和无限滚动场景。
-
后端通过游标(如
id或created_at)实现分页查询,并返回next_cursor和prev_cursor。 -
前端根据游标加载下一页或上一页数据。
-
与传统分页相比,游标分页更适合动态数据场景,但无法支持随机跳页。
通过以上实现,可以高效地处理大数据集的分页需求,同时避免传统分页的常见问题。
相关文章:
分页优化之——游标分页
游标分页(Cursor-based Pagination) 是一种高效的分页方式,特别适用于大数据集和无限滚动的场景。与传统的基于页码的分页(如 page1&size10)不同,游标分页通过一个唯一的游标(通常是时间戳或…...
算法模型从入门到起飞系列——广度优先遍历(BFS)
文章目录 前言一、广度优先遍历(BFS)简介1.1 广度优先遍历(BFS)的特点1.2 广度优先遍历(BFS)的要素 二、广度优先遍历(BFS)& 深度优先遍历(DFS)2.1 广度优…...
AsyncHttpClient使用说明书
[[toc]] AsyncHttpClient(AHC)是一个高性能、异步的 HTTP 客户端库,广泛用于 Java 和 Scala 应用中,特别适合处理高并发、非阻塞的 HTTP 请求。它基于 Netty 或 Java 原生的异步 HTTP 客户端实现,支持 HTTP/1.1 和 HTTP/2 协议,适用于微服务、API 调用、爬虫等场景。 1.…...
FRP在远程办公中的实战应用
远程办公场景中,FRP可穿透企业防火墙,安全访问内网资源。以下是典型用例: SSH远程连接 配置示例: 客户端配置SSH映射,将本地22端口映射至公网服务器的6000端口,用户通过ssh -p 6000 user公网IP即可连接内网…...
git 设置保存密码 git保存密码
目录 长久保存密码 长久保存密码 git push和git pull都能使用。 git config --global credential.helper store 然后执行一次 git pull,Git 会提示输入用户名和密码, 输入后保存路径: ~/.git-credentials , Windows系统&…...
<项目> 主从Reactor模型的高并发服务器
目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop(核心) eventfd 设计思路 …...
注意力机制,本质上是在做什么?
本文以自注意机制为例,输入一个4*4的矩阵 如下: input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时,计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…...
使用Python在Word中创建、读取和删除列表 - 详解
目录 工具与设置 Python在Word中创建列表 使用默认样式创建有序(编号)列表 使用默认样式创建无序(项目符号)列表 创建多级列表 使用自定义样式创建列表 Python读取Word中的列表 Python从Word中删除列表 在Word中ÿ…...
右键添加:新建HTML模板文件
使用注册表给Windows右键添加:新建HTML文档模板的功能_注册表右键新建-CSDN博客 新建文件有了,但是没有引用模板文件,是空文件。 默认改成 htmlfile 模板成功...
Windows10配置OpenJDK11
下载 # 华为OpenJDK镜像源 https://mirrors.huaweicloud.com/openjdk/11.0.2/解压 # 解压后至于C:\Dev\Env\Java\jdk-11.0.2目录下 https://mirrors.huaweicloud.com/openjdk/11.0.2/openjdk-11.0.2_windows-x64_bin.zip编译安装 # 以管理员身份运行 CMD命令提示符 并进入JD…...
浅谈Go垃圾回收机制-面试笔记
Go 语言的垃圾回收机制(Garbage Collection,GC)是其内存管理的重要组成部分,以下是相关介绍: 1、基本原理 标记 - 清除算法:Go 语言的垃圾回收主要基于三色标记 - 并发清除算法。首先,从根对象…...
统一开放世界与开放词汇检测:YOLO-UniOW无需增量学习的高效通用开放世界目标检测框架
目录 一、摘要 二、引言 三、相关工作 开放词汇对象检测 开放世界目标检测 参数高效学习 四、高效通用的开放世界目标检测 问题定义 高效的自适应决策学习 开放世界通配符学习 五、Coovally AI模型训练与应用平台 六、实验 数据集 评价指标 实施细节 定量结果 …...
如何给商品一键换色?图生生AI,告别繁琐修图
在电商竞争日益激烈的今天,商品图片的视觉效果直接影响着消费者的购买决策。而商品颜色的展示,更是重中之重!传统的图片换色方式,往往需要耗费设计师大量的时间和精力,从抠图到调色,再到细节调整࿰…...
AIGC-名人语录账号运营创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)...
基于MySQL的创建Java实体Bean和TypeScript实体Bean
基于MySQL的创建Java实体Bean和TypeScript实体Bean 基于MySQL的创建Java实体Bean和TypeScript实体Bean select ORDINAL_POSITION as a, -- Data -- Schema(description "货物管理表") -- TableName("lpg_cargo") -- public class CargoEntity implements…...
10-STL、位运算、常用函数库
1-STL vector vector是变长数组 //定义vector vector<int>a;//第一维长233,第二维长度动态变化 vector<int>b[233];//自定义的结构体类型也可以保存在vector中 struct res{...}; vector<rec>c;//函数 a.size();//返回vector的实际长度…...
练习-班级活动(map存储键值对)
问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 ai。 老师希望…...
纯血鸿蒙:中国操作系统自主创新的里程碑
引言:破局者登场 2024 年 10 月,搭载纯血鸿蒙操作系统(HarmonyOS NEXT)的华为 Mate 70 系列正式发布,首日预约量突破 330 万。这场现象级热度的背后,不仅是消费者对硬件创新的期待,更是中国科技…...
OpenHarmony 开源鸿蒙北向开发——hdc工具安装
hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备(或模拟器)进行连接调试通信。简单来讲,hdc 是 Op…...
buu-bjdctf_2020_babystack2-好久不见51
整数溢出漏洞 将nbytes设置为-1就会回绕,变成超大整数 从而实现栈溢出漏洞 环境有问题 from pwn import *# 连接到远程服务器 p remote("node5.buuoj.cn", 28526)# 定义后门地址 backdoor 0x400726# 发送初始输入 p.sendlineafter(b"your name…...
YOLO魔改之SAM空间注意力模块
基于SAM注意力的YOLOv7改进算法详解(可用于工业检测方案) 一、应用场景说明 本改进算法适用于以下工业检测场景: 复杂背景下的微小目标检测(电子元件缺陷、PCB板焊点)密集目标重叠检测(传送带上的包裹分拣、人群计数)动态环境目标追踪(无人机巡检、自动驾…...
【Java SE】抽象类/方法、模板设计模式
目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式(抽象类使用场景) 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法,需要声明,但是又不确定如何实现时ÿ…...
文件相关函数的总结与记忆
1.字符的输入输出 char ch getchar();//不需要传递参数 putchar(a)putc、getc与fputc、fgetc一致 //必须用int接受,因为返回int类型,char因为编译器不同而可能为无符号和有符号 int ch if( (ch getchar() ) ! EOF) 2.行的输入输出 也可以用于二进制…...
SpringBoot有几种获取Request对象的方法
HttpServletRequest 简称 Request,它是一个 Servlet API 提供的对象,用于获取客户端发起的 HTTP 请求信息。例如:获取请求参数、获取请求头、获取 Session 会话信息、获取请求的 IP 地址等信息。 那么问题来了,在 Spring Boot 中…...
Unix 域套接字(本地套接字)
Unix 域套接字(Unix Domain Sockets),也称为本地套接字(Local Sockets),是一种用于同一主机上进程间通信(IPC)的机制。Unix 域套接字提供了一种高效的进程间通信方式,它利…...
Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍
目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例(nRF52 系列࿰…...
go安装lazydocker
安装 先安装go环境 https://blog.csdn.net/Yqha1/article/details/146430281?fromshareblogdetail&sharetypeblogdetail&sharerId146430281&sharereferPC&sharesourceYqha1&sharefromfrom_link 安装lazydocker go install github.com/jesseduffield/laz…...
LangChain开发(一)介绍和第一个例子
文章目录 简介LangChain框架组成LangChain库(Libraries)LangChain任务处理流程核心概念1. LLMs2. Chat Models3. 消息(Message)4. 提示(prompts)5. 输出解析器(Output Parsers)6.Ret…...
Chrome-Edge-IDEA-Win 常用插件-工具包
Chrome-Edge-IDEA-Win 常用插件-工具包 Chrome-Edge-IDEA-Win 常用插件-工具包谷歌插件chropathJSONViewOctotree - GitHub code treeXPath Helper书签侧边栏篡改猴Print Edit WEEdge浏览器插件IDEA插件CodeGlance Pro 代码迷你缩放图插件Alibaba Cloud ToolkitAlibaba Java Co…...
电加热产品亚马逊审核标准UL499报告
很多亚马逊卖家都上架应季产品 像加热垫 加热杯垫 加热毯等产品 都少不了亚马逊UL测试的报告 亚马逊明确要求 电子产品在亚马逊销售就必须需要有UL报告 不然就产品就被有下架的风险。由于 UL 标准也就是美洲的安全测试标准,因此亚马逊出于对安全的考虑会加强对带电的…...
