如何在 Spring Boot 中正确缓存 Pageable 查询结果
SpringBoot缓存Pageable查询结果时,直接利用PageRequest重写的equals/hashCode作为缓存键,自动区分页码、页大小和排序。注意:自定义实现需重写equals/hashCode;合理设置缓存容量;配合@CacheEvict清理相关缓存。
说到 Spring Boot 中的分页缓存,很多开发者第一反应往往是手动拼接缓存键:把 page、size、sort 一个个提取出来,再拼成一个字符串。其实完全没必要——Spring 的缓存抽象比你想象的要聪明得多。
关键在于 Pageable 这个接口的标准实现,比如 PageRequest,已经老老实实地重写了 equals() 和 hashCode() 方法。这意味着什么呢?举个具体的例子:你调用 PageRequest.of(0, 20, Sort.by("name")) 两次,这两个对象语义完全一致,它们的哈希值也一样;但如果把页码改成 1,或者排序字段换成 price,就会生成一个完全不同的哈希值。这套机制天然就能区分不同的页码、页大小和排序条件——按页粒度的缓存,直接开箱即用。

所以,下面这种写法不仅合法,而且值得推荐:
@Service
public class MarketServiceImpl implements MarketService {
@Autowired
private MarketDao marketDao;
@Cacheable(value = "marketData")
public Page findAllMarket(Pageable pageable) {
return marketDao.findAll(pageable);
}
}
这里有几个关键点需要注意:
- 不需要显式指定 key 属性——Spring 默认会把所有方法参数(这里就是
pageable对象)拿来构建缓存键; - 多维度区分是天然支持的——页码、每页条数、排序字段和方向都会参与到哈希计算中,一个不落;
- 线程安全且无副作用——
PageRequest是不可变对象,多线程环境下用起来很放心。
当然,有几个坑得提前避开:
- 如果你自己写了一个自定义的
Pageable实现,却忘了重写equals()和hashCode(),那缓存要么失效,要么出现诡异的冲突——建议一律使用PageRequest.of(...)来构造; - 缓存容量要合理设置(比如用 Caffeine 时记得配置
maximumSize),否则用户翻几万页,每个页号都生成一条缓存,内存很快就被吃光了; - 别忘了配合
@CacheEvict清理相关缓存——比如新增或删除了商品,就应该把marketData里所有分页结果都清掉,否则用户看到的还是旧数据。
总结起来,Spring Boot 对 Pageable 的缓存支持简洁又健壮。你只需要相信默认行为,把精力放在业务逻辑上,分页级缓存的能力就已经摆在那了。
Adobe Acrobat Pro 是面向办公、法务、财务、教育及出版用户的专业PDF处理软件,可在Mac上创建、编辑、转换、合并和保护文档,并提供OCR文字识别、表单、批注、内容比较、敏感信息遮盖及电子签名功能。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。
AutoCAD 是 Autodesk 推出的专业计算机辅助设计软件,Windows 版支持精确二维绘图、三维实体与曲面建模、图纸标注、布局发布和任务自动化,并包含多套行业专业化工具组合,适用于建筑、机械、电气、工程建设及制造设计人员。














