成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

現代應用中基于偏移量和游標分頁的高效數據管理

譯文
存儲 數據管理
本文探索與Jakarta Data、Quarkus和MongoDB集成的基于偏移量和游標的分頁,強調它們在REST API中的優勢和實際用途。

譯者 | 李睿

審校 | 重樓

在軟件開發中,有效地管理大型數據集至關重要。而檢索策略在提高性能和可擴展性方面起著至關重要的作用,特別是在響應時間非常關鍵的情況下。分頁是有效管理數據的一項核心技術,它對于優化性能和資源管理至關重要。本文將探討適用于不同場景和需求的兩種分頁策略:基于偏移量的分頁和基于游標的分頁。這些策略將幫助用戶了解分頁的重要性,以及它們如何使他們的系統受益。

利用Jakarta Data,本文將探索這些分頁技術集成到使用Quarkus和MongoDB開發的REST API中。這種組合展示了實際應用的實現,并突出了現代技術和先進數據處理方法之間的協同作用。

本文旨在全面理解每種分頁方法的機制、優點和權衡,使開發人員能夠做出適合復雜和高需求應用程序的明智決策。

分頁:從古代卷軸到現代數據庫

分頁是數據組織中的一個重要概念,其根源可以追溯到最早的書面記錄形式。在現代應用方法中,分頁將內容劃分為離散的頁面,無論是印刷頁面還是數字頁面。通過使信息訪問易于管理和直觀,以及通過限制在任何時間加載或呈現的數據量來增強數據檢索系統的性能來改進用戶體驗。

有效數據組織的必要性是一個復雜的難題。像羅馬這樣的古代文明發展了早期管理大量書面信息的方法。盡管古羅馬人沒有像現代人所理解的那樣使用分頁——將文本劃分為頁面,但他們實施了預示著現代分頁系統的組織方法。

在羅馬,長文本通常寫在紙莎草或牛皮紙制成的卷軸上。這些卷軸很長,采用索引和標記來導航。這種標記的作用類似于現代目錄,引導讀者閱讀不同的文本部分。雖然按照當今的標準來看,這種方法很簡陋,但它代表了一種早期的分頁形式,原因是它將信息組織成可以獨立訪問的片段。

此外,羅馬人還使用蠟板來記錄較短的文件。這些蠟板可以裝訂在一起,形成一種類似于當今書籍的結構——手抄本(codex)。手抄本的出現是文本組織的一次重大演變,使人們能夠更快、更有效地獲取信息。用戶可以翻頁,這顯然是當前分頁系統的前身,顯著地提高了查看信息的速度和便利性。

在數字時代,分頁對于有效處理大型數據集至關重要。數字分頁通過分段交付內容而不是要求同時加載整個數據集,有助于管理服務器負載并縮短響應時間。它通過提供無縫的導航體驗來節省資源,并改進用戶與應用程序的交互。

古羅馬的文本組織方法和現代數字分頁之間的相似之處突出了貫穿歷史的持續需求:有效地管理大量信息。無論是通過卷軸上的物理標記、手抄本的開發,還是復雜的數字分頁算法,其核心挑戰仍然是一樣的——使信息可訪問和可管理。

現代應用中的分頁:必要性和策略

分頁是現代軟件應用程序中的一個基本特性,它有助于將數據組織成可管理的部分。這種方法通過防止信息過載來增強用戶體驗,并通過減少后端系統的負載來優化應用程序性能。當對數據進行分頁時,系統一次只能查詢和呈現必要的數據子集,從而減少內存使用并改善響應時間。它在大型數據集或用戶高并發性應用程序中尤其重要。在這些應用程序中,高效的數據處理可以顯著提高可擴展性和用戶滿意度。

分頁非常有用,但它也帶來了一些挑戰。開發人員需要仔細平衡用戶體驗和服務器性能。實現分頁需要在客戶端和服務器端附加邏輯,這會使其開發變得更加復雜。雖然分頁可以通過只獲取部分數據來減少初始加載時間,但它可能會增加用戶在多個頁面中導航時的總等待時間。而維護頁面之間的場景,例如排序和過濾器,也需要仔細的狀態管理,并增加了復雜性。

在現代網頁(Web)開發中,有兩種主要的分頁策略:基于偏移量的分頁和基于游標的分頁。每種分頁策略都有優點和缺點,使其更適合不同的場景。

基于偏移量的分頁

基于偏移量的分頁是將數據劃分為可管理數據塊的傳統方法。在返回一定數量的記錄之前,跳過指定數量的記錄來訪問數據。這種技術經常用于Web和數據庫應用程序中,以便使用簡單的數字偏移量直接導航到特定的頁面。

圖1基于偏移量的分頁示意圖圖1基于偏移量的分頁示意圖

基于偏移量的分頁實現通常涉及數據庫查詢中的兩個關鍵參數:

  • LIMIT:該參數指定在單個頁面中返回的最大記錄數。它定義了每個數據塊的大小,與分頁中的“頁面”概念保持一致。
  • OFFSET:該參數表示從數據集開頭跳過的記錄數。OFFSET的值通常計算為(頁面-1)*頁面大小,允許用戶直接跳轉到任何頁面的開頭。

基于偏移量的分頁因其簡單和直接的實現而備受青睞。在用戶可以直接跳轉到特定頁面,并且記錄總數已知且相對穩定的應用程序中,這種方法尤其有效。這使得它非常適合用戶友好的導航和簡單性至關重要的情況。

基于偏移量的分頁的主要限制是它在大型數據集上的可擴展性。隨著數據集的增長和用戶請求的頁面數量的增加,跳過許多記錄的成本也會增加。這將導致查詢性能變慢,因為每個后續頁面都需要計數和跳過更多記錄才能到達所需頁面的起始點。

如果底層數據需要插入、刪除或修改,用戶在頁面之間導航時可能會遇到“幻讀”或跳過記錄。發生這種情況是因為偏移量沒有考慮初始頁面加載后數據集大小或順序的變化。

基于偏移量的分頁由于其用戶友好的方法和易于實現的特點,仍然是許多應用程序的熱門選擇。然而,了解其局限性并正確規劃其使用對于確保系統在數據擴展時保持響應并提供良好的用戶體驗至關重要。

基于游標的分頁

基于游標的分頁是在大型或動態更新的數據集中管理數據檢索的有效方法。它使用游標(對數據集中特定點的引用)從游標位置開始順序獲取數據。

圖2基于游標的分頁示意圖圖2基于游標的分頁示意圖

基于游標的分頁依賴于游標來指導數據獲取。游標可以包含多個字段,以確保精確的數據檢索和維護排序順序。以下是它的結構:

(1)游標字段

一個或多個字段唯一標識數據集中每條記錄的位置。這些字段應該是穩定的(即設置之后不更改)和唯一的,以防止重復和確保數據完整性。常用的字段包括時間戳、唯一ID或多個字段的組合,以支持復雜的排序需求。

(2)查詢方向

這個指定數據檢索相對于游標位置是向前移動還是向后移動。它在社交媒體訂閱源或日志監控系統等可能感興趣的新條目或舊條目的應用程序中非常有用。

(3)多個字段的使用

當按多個條件排序時(例如,按creation_date和title對博客文章進行排序),游標可以包含這些字段,以確保分頁在查詢之間保持指定的排序順序。它對于一致性至關重要,特別是在數據集很大或經常更新的情況下。

在分頁中使用游標對于大型或頻繁更新的數據集特別有利,因為它避免了跳過記錄的性能開銷,并確保對數據的一致訪問。

雖然基于游標的分頁提供了顯著的性能優勢并增強了數據一致性,但其實現可能很復雜。它需要設置一個穩定且唯一的游標,這可能具有挑戰性,特別是在沒有明顯唯一標識符的數據集中。此外,它將用戶限制為順序導航,這在需要隨機訪問數據的用例中可能是一個限制。調整用戶界面以平滑地使用基于游標的分頁,特別是在游標中使用多個字段時,也會增加開發的復雜性。

在應用程序中實現分頁時,開發人員通常必須在基于偏移量的分頁和基于游標的分頁之間進行選擇。每種方法都有不同的優勢和挑戰。為了做出明智的決策,了解這些方法在各個方面的比較是至關重要的,例如實現的容易程度、性能、數據一致性和用戶導航。為了幫助確定最適合軟件開發中不同場景的分頁策略,下表提供了基于偏移量和基于游標的分頁的全面比較,突出了關鍵特性和典型用例。此外,該表還考慮了可擴展性。

功能

基于偏移量的分頁

基于游標的分頁

描述

使用數字偏移量對數據進行分頁,以便在返回下一組記錄之前跳過幾條記錄

使用游標(通常是唯一標識符)從指定位置按順序獲取數據

實施

使用LIMIT和OFFSET參數實現基本的SQL或NoSQL查詢很簡單

實現起來比較復雜,需要一個穩定且唯一的字段作為游標

最佳用例

非常適合中小型數據集和應用程序,其中總數據計數和對任何頁面的直接訪問是有益的

非常適合大型或動態變化的數據集,其中性能和數據一致性至關重要

性能

性能隨著數據集大小的增加而下降,特別是當訪問由于跳過記錄的負載增加而導致的更高頁碼時

始終如一的高性能,因為它避免了跳過記錄和直接從游標位置開始訪問數據的開銷

數據一致性

如果底層數據發生變化,在分頁過程中容易出現幻讀或數據重復等問題

提供更好的一致性,因為每個頁面加載取決于游標的位置,這可以適應數據的變化

用戶導航

允許用戶直接跳轉到任何特定頁面,方便隨機訪問

通常將用戶限制為順序導航,這可能不適合所有應用程序

查詢的復雜性

簡單的查詢,直接的分頁邏輯

查詢可能很復雜,特別是當多個字段用作游標以維護順序和唯一性時

可擴展性

由于較高偏移量增加了查詢負載,因此在較大數據集的情況下可擴展性較差

高度可擴展,特別有效地處理龐大的數據集

在處理大型數據集時,了解分頁策略的效率和局限性至關重要。基于偏移量的分頁的一個主要挑戰是,隨著偏移量的增加,訪問數據變得更加困難,特別是在大型數據集中。例如,如果一個數據集有100萬條記錄,并被分成100個頁面,那么訪問最后一個頁面(第10000頁)將要求數據庫在傳遞最后100條記錄之前處理并丟棄最初的999,900條記錄。隨著數據集的增長,它可能導致更長的加載時間,使得基于偏移量的分頁在處理大量數據時不太實用。

與基于偏移量的分頁相比,基于游標的分頁是管理廣泛數據集的更有效的解決方案。對于基于偏移量的分頁,高偏移量可能會導致性能問題,但是基于游標的分頁通過使用游標跟蹤最后獲取的記錄來避免這些缺陷。該方法允許后續查詢從最后一個查詢結束的地方開始,從而提高數據檢索速度。為了說明這一點,本文附帶的圖表比較了基于偏移量的分頁和基于游標的分頁在處理730萬條記錄的數據集時的性能,顯示了使用游標進行分頁的速度優勢顯著。

這種可視化表示強調了在考慮數據集大小和訪問模式等因素的情況下選擇適當分頁方法的戰略重要性。這確保了最佳的性能和用戶體驗,這是大規模數據處理的關鍵考慮因素。

圖3 MySQL中730萬條記錄的基于偏移量和游標的分頁(來源)圖3 MySQL中730萬條記錄的基于偏移量和游標的分頁(來源)

選擇基于偏移量的分頁還是基于游標的分頁取決于應用程序的特定需求。基于偏移量的分頁對于較小的數據集或需要直接頁面訪問時效果很好,而基于游標的分頁更適合大型或動態數據集。接下來,將在一個示例應用程序中演示這兩種方法,以展示每種方法的實際含義。

實用的分頁介紹

本節將從關于分頁的理論討論過渡到實際演示,重點介紹實現基于偏移量的分頁和基于游標的分頁的不同方法。以下將探索這些概念,在與MongoDB配對的Quarkus應用程序中使用Jakarta Data。這種設置能夠通過操作可管理的數據集來直接比較兩種分頁技術。

設定的目標是提供一個清晰的示例,說明如何使用Jakarta Data無縫集成和管理這兩種分頁策略,這是Java應用程序中用于數據處理的強大工具集。雖然這個演示的重點是一個只涉及10個元素的簡單場景,但重要的是要注意,所討論的原則和方法并不局限于小數據集。它們是可擴展的,適用于更大的數據集,讓用戶有信心在現實場景中應用這些策略。

此外,開發一個全面的REST API(包括使用查詢參數和實現用于分頁的HATEOAS(超媒體作為應用程序狀態引擎))的更廣泛的場景值得進行詳細的討論。設計此類API所涉及的復雜性以及有效合并分頁的策略是在這里不深入研究的重要主題。與其相反,這一演示旨在介紹使用Jakarta Data進行分頁的核心概念,重點關注分頁機制的技術實現,而不是REST API設計的復雜性。最后將在文章結尾處為那些有興趣深入探索REST API構建的更廣泛背景和細節的人員提供參考。

本文專門討論了Jakarta Data中可用的分頁特性。但是,需要注意的是,Jakarta Data提供了廣泛的功能,旨在簡化Jakarta EE應用程序的持久性集成。

Jakarta Data通過其API促進分頁,在管理大型數據集或需要復雜查詢功能的應用程序中實現高效的數據處理和檢索。兩個主要組件支持分頁功能:

1.創建PageRequest

Jakarta Data提供了PageRequest類來封裝分頁請求。以下是如何指定不同類型的分頁:

(1)基于偏移量的分頁

當想要為數據檢索指定特定的頁面和大小時,使用這個方法。它很簡單,適合于已知項目總數的許多標準用例。

Java 
 PageRequest offSet = PageRequest.ofPage(1).size(10);

(2)基于游標的分頁

這一方法用于處理連續數據流或數據集較大且經常更新的情況。它允許從某一點連續獲取數據,而無需重新查詢先前獲取的記錄。

Java 
 PageRequest cursor = PageRequest.ofSize(10).afterCursor(PageRequest.Cursor.forKey("key"));

這兩種方法都旨在通過限制每個查詢檢索的記錄數量來優化數據獲取過程,從而提高性能和資源利用率。

2.特殊參數

Jakarta Data還允許使用特殊參數來增強存儲庫接口的功能。這些參數可用于進一步優化分頁策略,包括限制、排序和更復雜的分頁機制。

分頁查詢的標準返回結構是頁面(Page)接口,它提供了一種處理分頁數據的簡單方法。Jakarta Data提供了一個名為CursoredPage的專門版本,用于基于游標的分頁。這種結構對于傳統的基于頁面的導航不足或不實用的場景是有益的。

實際的例子

根據之前關于Jakarta Data分頁特性的討論,希望通過一個實際示例展示如何在實際應用程序中實現這些功能。所展示的示例將Jakarta Data與Eclipse JNoSQL、Quarkus和MongoDB結合使用,以展示Jakarta Data的靈活性和強大功能,特別是它如何通過Jakarta Persistence與NoSQL和關系數據庫進行接口。

對于那些有興趣探索完整代碼并深入了解其功能的人,可以在這里找到樣例項目:Quarkus Pagination with JNoSQL and MongoDB.

示例中的FruitRepository擴展了BasicRepository,利用Jakarta Data的功能以一種簡化的方式與數據庫進行交互。這個存儲庫演示了Jakarta Data獲取和管理數據的三種主要方法:

(1)使用@Find注釋:通過允許直接基于注釋的查詢,簡化了查詢過程。

(2)使用Jakarta Query Language:支持類似于SQL的更復雜的查詢,適合高級數據操作。

(3)按查詢約定使用方法:促進基于方法命名約定的查詢,使代碼更易于閱讀和維護。

在FruitRepository中,實現了兩個特定的方法來處理分頁:

Java 
 @Repository
 public interface FruitRepository extends BasicRepository<Fruit, String> {

 @Find
 CursoredPage<Fruit> cursor(PageRequest pageRequest, Sort<Fruit> order);

 @Find
 @OrderBy("name")
 Page<Fruit> offSet(PageRequest pageRequest);

 long countBy();
}
  • 基于游標的分頁:它利用CursoredPage<Fruit>來有效地管理大型數據集。這種方法在數據不斷更新的應用程序中特別有用,因為它提供了一種穩定和高性能的方式來處理順序數據檢索。
  • 基于偏移量的分頁:它使用一個簡單的Page<Fruit>來以更傳統的逐頁方式訪問數據。這種方法簡單明了,許多開發人員都很熟悉,非常適合具有穩定和可預測數據集的應用程序。

這些示例說明了Jakarta Data在處理不同分頁策略方面的多功能性,為開發人員提供了基于其特定應用程序需求的強大選項。這種方法不僅強調了Jakarta Data的實際應用,而且強調了它在不同類型的數據庫和數據管理策略之間的適應性。

在使用Jakarta Data的實際實現的基礎上,Quarkus應用程序中的FruitResource類為基于偏移量的分頁和基于游標的分頁方法提供REST端點。這個設置有效地展示了這兩種策略之間的細微差別,以及如何將它們應用于RESTful數據服務。

在FruitResource類中,為不同的分頁策略定義了兩個不同的REST端點。

這個端點演示偏移分頁,其中客戶端可以將頁面和大小指定為查詢參數。它很簡單,允許用戶直接跳轉到特定的頁面。這種方法對于總大小已知且需要在頁面之間進行可預測導航的數據集特別有效。

Java 
 @Path("/offset")
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public Iterable<Fruit> hello(@QueryParam("page") @DefaultValue("1") long page,
 @QueryParam("size") @DefaultValue("2") int size) {
 var pageRequest = PageRequest.ofPage(page).size(size);
 return fruitRepository.offSet(pageRequest).content();
 }

這個端點滿足了基于游標的分頁,這對于處理大型或頻繁更新的數據集至關重要。游標充當指針,便于連續獲取記錄,而不會跳過之前的數據。這種方法確保了效率和一致性,特別是在處理實時數據流時。客戶端可以根據需要的導航方向提供前后游標。

兩個端點都使用定義為ASC或DESC的Sort<Fruit>來確定獲取記錄的順序。通過確保數據按邏輯順序呈現,這種排序順序增強了分頁的可用性。

Java 
 @Path("/cursor")
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public Iterable<Fruit> cursor (@QueryParam("after") @DefaultValue("") String after,
   @QueryParam("before") @DefaultValue("") String before,
 @QueryParam("size") @DefaultValue("2") int size) {
 if (!after.isBlank()) {
 var pageRequest = PageRequest.ofSize(size).afterCursor(PageRequest.Cursor.forKey(after));
 return fruitRepository.cursor(pageRequest, ASC).content();
 } else if (!before.isBlank()) {
 var pageRequest = PageRequest.ofSize(size).beforeCursor(PageRequest.Cursor.forKey(before));
 return fruitRepository.cursor(pageRequest, DESC).stream().toList();
 }
 var pageRequest = PageRequest.ofSize(size).size(size);
 return fruitRepository.cursor(pageRequest, ASC).content();
}

FruitResource類設計是一個很好的例子,說明了如何定制不同的分頁方法以適應特定的應用程序需求。通過在單個應用程序中比較這兩種方法,開發人員可以獲得基于其數據特征和用戶需求選擇和實現最合適分頁策略的實際見解。這種方法不僅展示了Jakarta Data在使用Quarkus和MongoDB的微服務架構中的能力,還增強了對RESTful服務設計和數據管理的理解。

結論

當在Quarkus和MongoDB環境中使用Jakarta Data應用基于偏移量的分頁和基于游標的分頁的復雜性時,已經實現了Jakarta Data在管理數據檢索過程中的適應性和有效性。這種探索提供了實際的用例,并強調了每種分頁方法的戰略優勢,使開發人員能夠根據他們的應用程序需求做出明智的決策。

本文為進一步探索Jakarta Data的功能及其與Quarkus等現代應用程序框架的集成提供了基礎。通過理解這些分頁技術,開發人員將能夠更好地構建可擴展且高效的應用程序,這些應用程序可以輕松地處理大型數據集。而在將來,選擇和實現最合適的分頁策略對于優化應用程序性能和增強用戶體驗至關重要。

參考文獻

原文標題:Efficient Data Management With Offset and Cursor-Based Pagination in Modern Applications,作者:Otavio Santana




責任編輯:華軒 來源: 51CTO
相關推薦

2023-08-07 09:18:32

Golang偏移量接口

2024-10-12 09:58:21

2024-03-21 07:08:53

AIntervalCronPython

2023-10-30 10:34:20

Golang數據庫

2016-02-25 14:40:01

云數據中心

2021-02-02 10:24:57

CIO數據管理IT

2024-12-12 16:21:16

2024-05-10 13:01:49

2022-04-02 10:42:04

數據管理數據管理現代化CIO

2022-08-15 10:45:34

RocketMQ消息隊列

2019-11-11 14:28:11

云計算數據IT

2021-12-03 14:52:46

Commvault

2020-04-18 11:15:38

云計算數據安全

2024-07-09 11:48:47

2024-04-23 14:47:46

2024-02-26 09:15:05

2012-09-18 09:39:57

Linq項目高效

2020-04-08 16:23:56

戴爾

2023-09-20 14:54:17

MySQL

2021-08-18 09:40:55

數據管理云原生Kubernetes
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费a级毛片在线播放 | 午夜视频免费网站 | 亚州春色| 亚洲欧美中文日韩在线v日本 | 免费看a | 久久高清 | 亚洲永久精品国产 | 久草青青 | 在线观看毛片网站 | 99精品欧美一区二区三区综合在线 | www.精品一区| 久久av一区二区三区 | 免费电影av | 色毛片 | 日韩精品免费 | 欧美视频 亚洲视频 | 久久久久免费精品国产 | 欧美一级网站 | 免费v片| 久久噜噜噜精品国产亚洲综合 | 日韩一区二区三区精品 | 久久av网站| 国产成在线观看免费视频 | 自拍偷拍小视频 | 亚洲福利在线观看 | 国产精品久久久久久久三级 | 国产h视频| 日韩一区二区三区在线观看 | 欧美中文字幕一区二区三区亚洲 | 一道本不卡视频 | 欧美一区二区在线观看 | av网站免费观看 | 国产 欧美 日韩 一区 | 亚洲精品1区 | 国产四区 | 91久久夜色精品国产网站 | 九九免费 | 亚洲欧美日韩久久久 | 中文字幕在线观看 | 九九热免费观看 | 国产成人99久久亚洲综合精品 |