首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Web 分頁三大方案深度對比:全量前端分頁、數據庫分頁查詢、緩存分頁策略

     編輯:Java 相關知識

方案對比表

方案原理優點缺點適用場景
全量前端分頁一次查所有,內存分頁實現簡單、查詢快、翻頁無延遲內存佔用大、網絡傳輸大、首屏慢數據量小(<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 頁,翻頁命中緩存
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved