分頁加載實(shí)現(xiàn)方案

一、基于偏移的分頁

例如: http://XXXXXXXlist?page=1&count=20

缺點(diǎn):

1、數(shù)據(jù)重復(fù)


數(shù)據(jù)重復(fù)

2、數(shù)據(jù)缺失


數(shù)據(jù)缺失

3、效率低
使用limit在數(shù)據(jù)量小的時候并不會有效率問題,但是當(dāng)數(shù)據(jù)偏移量很大時性能會開始急劇下降,查詢性能比對會在接下來提到。

綜上所述,流式分頁不需要也不適合使用傳統(tǒng)分頁,而是使用一種更合適的方法:游標(biāo)分頁。

所以這種分頁方法 適用于 數(shù)據(jù)部經(jīng)常變化的情況?;蛘吣玫綌?shù)據(jù)后做去重處理。

二、基于游標(biāo)分頁方案

基于游標(biāo)的分頁是最有效的分頁方法,應(yīng)盡量使用這種方法。游標(biāo)是指標(biāo)記數(shù)據(jù)列表中特定項(xiàng)目的一個隨機(jī)字符串。該項(xiàng)目未被刪除時,游標(biāo)將始終指向列表的同一部分,項(xiàng)目被刪除時游標(biāo)即失效。因此,您的應(yīng)用不應(yīng)存儲任何舊的游標(biāo),也不能假定它們?nèi)匀挥行А?/p>

游標(biāo)分頁的連線支持以下參數(shù):

  • before:這是指向已返回的數(shù)據(jù)頁面開頭的游標(biāo)。

  • after:這是指向已返回的數(shù)據(jù)頁面末尾的游標(biāo)。

  • limit:這是每個頁面返回的單獨(dú)對象的數(shù)量。請注意:這是上限。如果數(shù)據(jù)列表中沒有足夠的剩余對象,那么返回的數(shù)量將小于這個數(shù)。為提升性能,將為某些連線的 limit 值設(shè)置上限。在調(diào)用案例中,API 將返回正確的分頁鏈接。

  • next:將返回下一頁數(shù)據(jù)的圖譜 API 端點(diǎn)。如果未包含,則顯示的是最后一頁數(shù)據(jù)。根據(jù)分頁的可見性和隱私,頁面可能為空,但包含“next”分頁鏈接?!皀ext”鏈接不再出現(xiàn)時,應(yīng)停止分頁。

  • previous:將返回上一頁數(shù)據(jù)的圖譜 API 端點(diǎn)。如果未包含,則顯示的是第一頁數(shù)據(jù)。

Facebook 示例

{
 "data":[     ...端點(diǎn)數(shù)據(jù)在此 ], 
"paging":{   
  "cursors":{     
      "after":"MTAxNTExOTQ1MjAwNzI5NDE=",                
      "before":"NDMyNzQyODI3OTQw"   
    },   
      "previous":"https://graph.facebook.com/me/albums?limit=25&before=NDMyNzQyODI3OTQw",         
      "next":"https://graph.facebook.com/me/albums?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE=" 
    }
}

Twitter 示例

Twitter

請求參數(shù):

|參數(shù)| 是否可選| 描述 |
|:----|:-----||
|since_id|optional|Returns results with an ID greater than (that is, more recent than) the specified ID. There are limits to the number of Tweets which can be accessed through the API. If the limit of Tweets has occured since the since_id, the since_id will be forced to the oldest ID available. ** Example Values: 12345|
|count|optional|Specifies the number of tweets to try and retrieve, up to a maximum of 200 per distinct request. The value of count is best thought of as a limit to the number of tweets to return because suspended or deleted content is removed after the count has been applied. We include retweets in the count, even if include_rts is not supplied. It is recommended you always send include_rts=1 when using this API method.|
|max_id|optional|Returns results with an ID less than (that is, older than) or equal to the specified ID.
Example Values: 54321**|

返回結(jié)果:

"search_metadata": {
  "max_id": 250126199840518145,
  "since_id": 24012619984051000,
  "refresh_url": "?since_id=250126199840518145&q=php&result_type=recent&include_entities=1",

  "next_results": "?max_id=249279667666817023&q=php&count=10&include_entities=1&result_type=recent",

  "count": 10,
  "completed_in": 0.035,
  "since_id_str": "24012619984051000",
  "query": "php",
  "max_id_str": "250126199840518145"
}

問題: 如果 某一條 id 被刪除了,怎么處理?

三、基于時間的分頁

時間分頁使用指向數(shù)據(jù)列表中的特定時間的 Unix 時間戳在結(jié)果數(shù)據(jù)中導(dǎo)航。

基于時間的連線支持以下參數(shù):

  • until:指向基于時間的數(shù)據(jù)范圍末尾的 Unix 時間戳或 strtotime
    數(shù)據(jù)值。
  • since:指向基于時間的數(shù)據(jù)范圍開頭的 Unix 時間戳或 strtotime
    數(shù)據(jù)值。
  • limit:這是每個頁面返回的單獨(dú)對象的數(shù)量。限值 0 將不返回結(jié)果。為提升性能,將為某些連線的 limit 值設(shè)置上限。在調(diào)用案例中,API 將返回正確的分頁鏈接。
  • next:將返回下一頁數(shù)據(jù)的圖譜 API 端點(diǎn)。
  • previous:將返回上一頁數(shù)據(jù)的圖譜 API 端點(diǎn)。

抓包發(fā)現(xiàn) 新浪微博 使用的就是 基于時間的分頁

必選 類型 描述
since_id false int64 若指定此參數(shù),則返回ID比since_id大的微博(即比since_id時間晚的微博),默認(rèn)為0。
max_id false int64 若指定此參數(shù),則返回ID小于或等于max_id的微博,默認(rèn)為0。

加載更多1:
max_id  1474446495309988
返回1:
since_id    String  1474446349209988
max_id  String  1474446349209988
need_insert Integer 0
num Integer 17

加載更多2:
max_id  1474446349209988
返回2:
since_id    String  1474444074709993
max_id  String  1474444074709993
need_insert Integer 0
num Integer 11


加載更多3:
max_id  1474444074709993
返回3:
since_id    String  1474443946709988
max_id  String  1474443946709988
need_insert Integer 0
num Integer 12

下拉刷新
since_id    1474446662409995
refresh pulldown
isgzip  1
preAdInterval   7
返回:
since_id    String  1474447981509999
max_id  String  1474447981509999
interval    Integer 0
need_insert Integer 0
num Integer 0

四、延伸——數(shù)據(jù)的緩存

1、基于偏移的分頁方案 會有數(shù)據(jù)重復(fù)加載到,需要做好去重工作。

2、基于游標(biāo)的分頁方案 有數(shù)據(jù)連續(xù)性的問題。
例如 第一次 緩存 10-0 條,第二次 緩存了 30-20 條記錄。 第三次 打開 如果請求的數(shù)據(jù) 能 接上 第30條,則沒問題。但是 緩存的 10-0 條記錄 就斷掉了。

所以:
A)如果 80% 的訪問量 都是第一頁的數(shù)據(jù),例如最新的 20條 或者 40條 記錄,則可以 只緩存 第一頁的數(shù)據(jù)。
例如 新浪微博。
B)把每次斷掉的 id 都緩存起來。等加載到的時候再連上。

C)自己想到的方案:客戶端只緩存最新的連續(xù)數(shù)據(jù)。

  • 每次請求服務(wù)器的時候,都帶上最新的id(since_id)和最老的 id(max_id)。加載更多 或者 下拉刷新時,如果可以和緩存連接上,則同時返回 since_id 和 max_id 之間 變化的數(shù)據(jù)(例如刪除了某一條),客戶端做處理。
  • 下拉刷新時,假如本來一頁是返回10條數(shù)據(jù),但是實(shí)際上只有11or12條數(shù)據(jù),

五、 對比

一、傳統(tǒng)分頁:

總結(jié)

傳統(tǒng)分頁的特點(diǎn):

  • 可以直接根據(jù)頁碼跳轉(zhuǎn)到特定頁
  • 可能會出現(xiàn)重復(fù)、丟失數(shù)據(jù)的情況
  • 頁數(shù)較大時性能會降低
  • 排序條件與分頁無關(guān)

游標(biāo)分頁的特點(diǎn):

  • 不可以直接跳轉(zhuǎn)到特定頁(知道頁數(shù)),但是可以直接跳轉(zhuǎn)到最后一頁,能加載下一頁,上一頁。
  • 不會出現(xiàn)重復(fù)、丟失數(shù)據(jù)的情況
  • 查詢效率與頁數(shù)無關(guān),并且優(yōu)于傳統(tǒng)分頁
  • 不適合排序條件比較復(fù)雜的分頁

參考文檔:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內(nèi)容

  • ORACLE自學(xué)教程 --create tabletestone ( id number, --序號usernam...
    落葉寂聊閱讀 1,095評論 0 0
  • 分頁 REST framework 包含對可定制分頁樣式的支持。這使你可以將較大的結(jié)果集分成單獨(dú)的數(shù)據(jù)頁面。分頁 ...
    入間閱讀 1,321評論 0 2
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,829評論 0 11
  • 去年有段時間得空,就把谷歌GAE的API權(quán)威指南看了一遍,收獲頗豐,特別是在自己幾乎獨(dú)立開發(fā)了公司的云數(shù)據(jù)中心之后...
    騎單車的勛爵閱讀 20,622評論 0 41
  • DAY 9 10月30日凌晨4點(diǎn)就啟程上路了,因?yàn)榻裉斓哪康牡厥侵槟吕尸敺宕蟊緺I。拉孜到定日的318國道...
    途ag閱讀 481評論 1 2