分页优化之——游标分页

embedded/2025/3/20 7:38:09/

游标分页(Cursor-based Pagination) 是一种高效的分页方式,特别适用于大数据集和无限滚动的场景。与传统的基于页码的分页(如 page=1&size=10)不同,游标分页通过一个唯一的游标(通常是时间戳或唯一 ID)来标记分页的位置,避免了传统分页在数据变动时的重复或遗漏问题。

以下是游标分页在前后端的实现方式:


1. 游标分页的核心概念

  1. 游标(Cursor)

    • 游标是一个唯一标识符,通常是数据的某个字段(如 id 或 created_at)。

    • 游标用于标记分页的起始位置。

  2. 分页方向

    • 向前分页(Next Page):获取游标之后的记录。

    • 向后分页(Previous Page):获取游标之前的记录。

  3. 响应结构

    • 返回分页数据时,需要包含下一个游标和上一个游标,以便客户端继续分页。


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)
java">@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,获取最新的数据。

javascript">fetch('/posts?limit=10').then(response => response.json()).then(data => {console.log(data);// 渲染数据// 保存 next_cursor 和 prev_cursor});
3.2 加载下一页
  • 使用 next_cursor 请求下一页数据。

javascript">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 请求上一页数据。

javascript">fetch(`/posts?cursor=${prevCursor}&limit=10&direction=prev`).then(response => response.json()).then(data => {console.log(data);// 渲染数据// 更新 next_cursor 和 prev_cursor});

4. 游标分页的优点

  1. 高效

    • 基于游标的分页可以利用索引,查询性能更高。

  2. 稳定性

    • 数据变动时(如新增或删除记录),游标分页不会出现重复或遗漏问题。

  3. 适合无限滚动

    • 无限滚动场景下,游标分页比传统分页更自然。


5. 游标分页的缺点

  1. 不支持随机跳页

    • 游标分页只能按顺序加载下一页或上一页,无法直接跳转到指定页码。

  2. 实现复杂度较高

    • 需要前后端协同设计游标逻辑。


6. 总结

  • 游标分页 是一种高效且稳定的分页方式,特别适合大数据集和无限滚动场景。

  • 后端通过游标(如 id 或 created_at)实现分页查询,并返回 next_cursor 和 prev_cursor

  • 前端根据游标加载下一页或上一页数据。

  • 与传统分页相比,游标分页更适合动态数据场景,但无法支持随机跳页。

通过以上实现,可以高效地处理大数据集的分页需求,同时避免传统分页的常见问题。


http://www.ppmy.cn/embedded/174080.html

相关文章

三分钟掌握视频分辨率修改 | 在 Rust 中优雅地使用 FFmpeg

前言 在视频处理领域&#xff0c;调整视频分辨率是一个绕不过去的需求。比如&#xff0c;你可能需要将一段视频适配到手机、平板或大屏电视上&#xff0c;或者为了节省存储空间和网络带宽而压缩视频尺寸。然而&#xff0c;传统的FFmpeg命令行工具虽然功能强大&#xff0c;但复…

centos 7误删/bash 拯救方法

进入救援模式 1. 插入CentOS 7安装光盘&#xff0c;重启系统。在开机时按BIOS设置对应的按键&#xff08;通常是F2等&#xff09;&#xff0c;将启动顺序调整为CD - ROM优先。 2. 系统从光盘启动后&#xff0c;选择“Troubleshooting”&#xff0c;然后选择“Rescue a Cent…

C语言 第五章 指针(3)

目录 指针常用运算 定义&#xff1a; 指针与整数值的加减运算 格式&#xff1a; 举例&#xff1a; 说明&#xff1a; 实例 举例&#xff1a; 实例 指针的自增、自减运算 定义 实例1&#xff1a; 实例2&#xff1a; 指针常用运算 定义&#xff1a; 指针本质上就是一…

免费看付费电影网站制作,高清电影集合搜索引擎网站

引言 在当今数字化时代&#xff0c;电影已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;随着各大视频平台推出付费会员制度&#xff0c;许多用户开始寻找免费观看付费电影的途径。本文将详细介绍如何制作一个免费看付费电影的网站&#xff0c;并打造一个高清电影集…

东隆科技携手PRIMES成立中国校准实验室,开启激光诊断高精度新时代

3月12日&#xff0c;上海慕尼黑光博会期间&#xff0c;东隆科技正式宣布与德国PRIMES共同成立“中国校准实验室”。这一重要合作标志着东隆科技在本地化服务领域的优势与PRIMES在激光光束诊断领域的顶尖技术深度融合&#xff0c;旨在为中国客户提供更快速、更高精度的服务以及本…

python:music21 与 AI 结合应用探讨

Python 的 music21 库与人工智能&#xff08;AI&#xff09;技术结合应用具有广泛的可能性&#xff0c;尤其是在音乐生成、分析和风格模拟等领域。以下是具体的结合方向与示例&#xff1a; 1. 音乐生成与 AI AI 模型驱动音乐生成&#xff1a; 使用深度学习模型&#xff08;如 …

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近&#xff0c;国产AI大模型Deepseek成了网红爆款&#xff0c;大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

C++ 语法之函数和函数指针

在上一章中 C 语法之 指针的一些应用说明-CSDN博客 我们了解了指针变量&#xff0c;int *p;取变量a的地址这些。 那么函数同样也有个地址&#xff0c;直接输出函数名就可以得到地址&#xff0c;如下&#xff1a; #include<iostream> using namespace std; void fun() …