分頁第一頁用0還是1_如何設計api分頁

常規的分頁方式

API處理分頁看似簡單,實際上暗藏危機。最常見的分頁方式,大概是下面這樣的

/users/?page=1&limit=5
//服務端返回

最理想的情況下,客戶端請求第一頁的5條數據,服務端如常返回,比如下圖:

9dbf50c717eedb58632bb1fc1269e53c.png

拿Twitter的圖用一下,假設我們的數據庫有10條數據,按照5條一頁,正好有2頁。
在理想情況下,客戶端拉取數據時不會出現任何異常。但,這僅僅是正常情況,如果此時剛好有2條新數據插入。

bb6a9dc59581a58c853447d0e3903b4d.png

數據庫記錄變為13。原來第二頁的數據是[5, 4, 3, 2, 1],現在變為[7, 6, 5, 4, 3],我們再一次拿到了第一頁的數據。同理,如果用戶在拉取數據時正好有數據被刪除,一樣會出現類似的問題。

根據item_id分頁

要解決此類問題,就不能使用常規的分頁方式。現在,我們換一個思路,客戶端拉取數據時不再傳page,改為item_id,我們就把它稱為max_id

/users/?max_id=5&limit=5

此時服務端就知道我們上次拉取到了item_id為5的數據,繼續在它后面拉取5條, 如下圖:

1cc42968d760b40d86d8f53eb9e1b3d7.png

數據可以正常取回,不會再出現上一頁中的[6,7]。好了,讓我們再一次假設,此時又有8條數據插入了數據庫。再一次獲取數據

3ec6072749c16ff3a722f80c0f49532e.png

可以看出,再一次出現問題,我們又拿到了上一頁的[10,9]。所以,我們得告訴服務端,上一次拿到哪一條數據了。所以繼續增加一個since_id字段。

d102c280aeb1fcb83fdaf9177055b2a0.png

恩,再一次取出了正確的數據。可能你覺得一切都正常了,但還是隱藏了一個致命的缺陷。

上面的數據能正常獲取,是因為數據都是一個有序的集合,如果數據無序,且從數據庫取出時需要按照某個字段排序,那么一切再次打回原點:所有的分頁都亂了。

如何設計分頁API

可以看出,兩種分頁方式都存在問題。所以這兩種需求都是必要的,我們需要根據不同的業務場景使用不同的分頁方式。

為了不造成客戶端的麻煩,我們對api的分頁做了一些更改。

{

我們由服務端來決定如何分頁,前端需要做的,只是把next字段直接拼接到url中,這樣就可以應付各種分頁情況。

總結

常規的分頁方式不能應付經常變更的數據,sinceid和maxid的方式不能應付有其他排序的數據。大概就是這個樣子,沒有一種萬能的分頁方案,我們只能針對具體的業務場景去設計一個彈性的API來處理復雜的分頁場景。

ps: 最初我們想到的分頁方案,是直接使用item_id作為拉取數據的依據,后來看到Twitter的文章,感覺有更好的分頁方案,又懶得畫圖,所以就直接搬Twitter分頁的部分了。:)

參考鏈接:
Working with Timelines

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據挖掘腫瘤預測_科研套路不嫌多,數據挖掘發3分

解螺旋公眾號陪伴你科研的第2003天如何復現一篇3分生信研究做科研需要先學習套路,才能超越套路。今天給大家介紹的套路文獻是今年發表在《Oncology reports》(IF 3.041)上的一篇文章。文章的標題雖然看上去比較泛,但也讓讀者一眼就能知道主題了&#xff…

Jupyter notebook 導出PDF的3種方法

很多用Jupyter notebook的都想導出PDF,但是我們點擊Download as PDF via LaTex. 然后呢? Ohzzzzzzzzz 出現下圖的錯誤,看到這里感覺糟糕透啦。雖然可以根據提供的方法解決這個問題。下面我說說我的方法吧。 方法1 打開jupyter notebook&a…

mybatis中的#{value}和${value}的區別

2019獨角獸企業重金招聘Python工程師標準>>> 1. #{value}將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。 2. ${value}將傳入的數據直接顯示生成在sql中。 3. #{value}方式能夠很大程度防止sql注入。  4.${value}方式無法防止Sql注入。…

數據庫備份失敗問題

備份對于服務器“服務器名”失敗。(Microsoft.SqlServer.Smo) 其他信息:System.Data.SqlClient.SqlError:無法打開備份設備c:\abc.bak。出現操作系統錯誤5(拒絕訪問。)。(Microsoft.SqlServer.Smo) 解決辦法: Sql Serv…

重寫setTimeout擴展參數

1 //判斷函數行參長度來決定是否需要重寫setTimeout,ie8以下為undefined2 if(window.setTimeout.length undefined){3 var __sto window.setTimeout;4 window.setTimeout function(callback,timeout,param){5 var args Array.prototype.slice.c…

針對access數據庫的增刪改查

1、執行查詢操作:(ExecuteReader方法) string myConnectionString "Provider Microsoft.Jet.OLEDB.4.0;Data Source "Server.MapPath("~/") "App_Data/access.mdb"; //使用相對路徑連接數據庫 string mySel…

pandas 在jupyter notebook時候能用,但在vscode, pycharm不能用

先看錯誤。 AttributeError: partially initialized module ‘pandas’ has no attribute ‘Series’ (most likely due to a circular import) 分一下這種錯誤 ‘…’ has no attribute ‘…’ 庫沒有 ’…’ 這種問題,要么庫沒有裝好,或者裝的庫的…

解決 IDEA 調用其他類的時候自動加上包路徑和類名的情況_idea 快捷鍵匯總(轉)...

1.IDEA常用快捷鍵Alt回車 導入包,自動修正CtrlN 查找類CtrlShiftN 查找文件CtrlAltL 格式化代碼CtrlAltO 優化導入的類和包AltInsert 生成代碼(如get,set方法,構造函數等)CtrlE或者AltShiftC 最近更改的代碼CtrlR 替換文本CtrlF 查找文本CtrlShiftSpace 自動補全代碼Ctrl空格 代…

8位可控加減法器_自主可控:QTouch在軍工道系統上的應用

自主可控:QTouch在軍工道系統上的應用一、系統介紹"道系統"操作系統是一款面向各領域的嵌入式實時操作系統,支持單核及多核CPU硬件配置,可替換相關領域的VxWorks 6.8/6.9操作系統二、產品特性 具備自主知識產權的嵌入式實時操作系統…

截獲所有以太網幀數據并進行具體分析

/* capture_packet.c - 截獲所有以太網幀數據并進行具體分析 *//* 常用函數的頭文件 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include <signal.h>/* 與網絡相關…

Spark啟動程序:Master

臨時筆記def main(argStrings: Array[String]) {//讀取以spark.開頭的配置屬性val conf new SparkConf//檢查環境變量&#xff1a;SPARK_MASTER_HOST、SPARK_MASTER_PORT、SPARK_MASTER_WEBUI_PORT //再檢查配置屬性&#xff1a;master.ui.port //檢查其他master配置&am…

iOS - Frame 項目架構

前言 iOS 常見的幾種架構&#xff1a; 標簽式 Tab Menu列表式 List Menu抽屜式 Drawer瀑布式 Waterfall跳板式 Springborad陳列館式 Gallery旋轉木馬式 Carousel點聚式 Plus1、標簽式 優點&#xff1a; 1、清楚當前所在的入口位置2、輕松在各入口間頻繁跳轉且不會迷失方向3、直…

Windows 10下,anaconda (conda) 虛擬環境的創建,jupyter notebook如何使用虛擬環境

手把手教您創建conda 虛擬環境 1 安裝好anaconda后&#xff0c;會出現如下所示&#xff0c;這些都是anaconda集成啦&#xff0c;不需要再安裝了。我們在如下所指的anaconda Prompt右鍵&#xff0c;以管理員運行 2 打開后&#xff0c;這就是prompt&#xff0c;我們輸入pyth…

python下載文件傳到服務器_python實現FTP文件傳輸的方法(服務器端和客戶端)

用python實現FTP文件傳輸&#xff0c;包括服務器端和客戶端&#xff0c;要求 &#xff08;1&#xff09;客戶端訪問服務器端要有一個驗證功能 &#xff08;2&#xff09;可以有多個客戶端訪問服務器端 &#xff08;3&#xff09;可以對重名文件重新上傳或下載 FTP&#xff08;F…

oracle數據庫主鍵自增序列_Oracle數據庫序列詳解

前言&#xff1a;做過web開發的人員基本上都知道&#xff0c;數據庫表中的主鍵值有的時候我們會用數字類型的并且自增。這樣mysql、sql server中的都可以使用工具創建表的時候很容易實現。但是oracle中沒有設置自增的方法&#xff0c;一般情況我們會使用序列和觸發器來實現主鍵…

一步步學習微軟InfoPath2010和SP2010--第十三章節--SharePoint視圖和儀表板(9)--基于表單庫的儀表板...

現在你已經知道了如何將服務臺網站和表單與自定義視圖放在一起&#xff0c;最后一步是使用SharePoint創建儀表板&#xff0c;以呈現表單中的信息的基本報表。表單設計者經常致力于表單以至于他們忘記了SharePoint的力量來聚合表單的屬性&#xff0c;并建立KIPs和其他類型的報表…

SQL常用語句積累

SQL 常用語句積累&#xff1a;一、 SQL 基本語句SQL 分類&#xff1a;DDL —數據定義語言 (Create &#xff0c; Alter &#xff0c; Drop &#xff0c; DECLARE)DML —數據操縱語言 (Select &#xff0c; Delete &#xff0c; Update &#xff0c; Insert)DCL —數據控制語言 …

vscode 里 Import “numpy“ count not be resolved

問題如下&#xff1a; 我們分析一下這個問題&#xff0c;這里的問題。問題的翻譯是&#xff1a;導入"numpy"不能被解決。 這可能有幾個問題&#xff0c;1&#xff1a;vscode的python插件沒有安裝&#xff0c;2: vscode的python的解析器沒有設置好。 按照這個思路&…

xdocument查找節點值_二叉查找樹(java)

一棵二叉查找樹(BST)是一顆二叉樹&#xff0c;其中每個節點都含有一個Comparable的鍵且每個節點的鍵(以及相關的值)都大于其左子樹中的任意節點的鍵而小于右子樹的任意結點的鍵。數據表示和鏈表一樣&#xff0c;我們嵌套定義了一個私有類來表示二叉查找樹上的一個節點。每個節點…

三角形 畫_CAD入門基礎第3節:直角三角形的圓及如何修剪

這個軟件&#xff0c;仔細想想&#xff0c;無非就兩個命令&#xff0c;一是直線命令&#xff0c;二&#xff0c;就是圓。直線&#xff0c;無非也就是兩種&#xff0c;一&#xff0c;是水平直線和垂直于水平直線的豎線&#xff0c;二&#xff0c;就是各種斜線。第一種直線&#…