方案對比表
| 方案 | 原理 | 優點 | 缺點 | 適用場景 |
| 全量前端分頁 | 一次查所有,內存分頁 | 實現簡單、查詢快、翻頁無延遲 | 內存佔用大、網絡傳輸大、首屏慢 | 數據量小(<1000條)、後台管理 |
| 數據庫分頁查詢 | 每頁一條 SQL(LIMIT/OFFSET) | 內存佔用極小、數據實時 | 需兩次查詢(count+data)、深分頁性能差 | 數據量大、高併發、實時性要求高 |
| 緩存分頁策略 | 緩存多頁(如 1-10 頁),翻頁走緩存 | 均衡查詢壓力、減少 DB 訪問 | 實現複雜、可能髒讀、緩存一致性難 | 熱點數據、讀多寫少、可容忍秒級延遲 |
通用分頁接口設計
public interface Pageable {
List getResult(); // 當前頁數據
int getCount(); // 總記錄數
int getPageSize(); // 每頁大小
int getCurrentPage(); // 當前頁碼
int getPages(); // 總頁數
int DEFAULT_PAGESIZE = 20;
}
抽象基類實現
public abstract class AbstractPage implements Pageable {
private int currentPage, pageSize, pages;
protected int count;
protected List result;
public AbstractPage(int currentPage) { this(currentPage, DEFAULT_PAGESIZE); }
public AbstractPage(int currentPage, int pageSize) {
this.currentPage = currentPage; this.pageSize = pageSize;
}
// 子類必須實現:查詢 count 填充 result
protected abstract void init() throws PageException;
// getPages() 懶加載計算
public int getPages() {
if (pages == 0) pages = (count + pageSize - 1) / pageSize;
return pages;
}
// 其他 getter...
}
異常類
public class PageException extends Exception {
public PageException(String msg) { super(msg); }
}
具體實現策略
1. 全量內存分頁
public class MemoryPage extends AbstractPage {
private List allData;
public MemoryPage(List allData, int page, int size) {
super(page, size); this.allData = allData; init();
}
@Override protected void init() {
count = allData.size();
int from = (currentPage-1)*pageSize;
int to = Math.min(from+pageSize, count);
result = allData.subList(from, to);
}
}
2. 數據庫分頁(MySQL)
public class JdbcPage extends AbstractPage {
private String countSql, dataSql;
public JdbcPage(String countSql, String dataSql, int page, int size) {
super(page, size); this.countSql = countSql; this.dataSql = dataSql; init();
}
@Override protected void init() {
// 1. 查總數
count = jdbcTemplate.queryForObject(countSql, Integer.class);
// 2. 查分頁數據
String pageSql = dataSql + " LIMIT ?,?";
result = jdbcTemplate.query(pageSql, (rs, rowNum) -> mapRow(rs),
(currentPage-1)*pageSize, pageSize);
}
}
選型建議
- 後台管理、配置表 → 全量前端分頁
- 電商商品列表、日誌查詢 → 數據庫分頁 + 索引優化
- 熱門資訊流、排行榜 → Redis 緩存前 10 頁,翻頁命中緩存