小小的分頁引發的加班血案

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e9/e9aad6b496ddab7c510bbc65d644700e.jpeg","alt":"image","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"link","attrs":{"href":"#問題分析","title":null}},{"type":"text","text":"問題分析"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過以上的對話,身爲程序員的你是否也遇到過妹子這樣的問題呢?傳統的而且網上到處充斥着的也是這類方式,客戶端根據自己的滾動不斷的更新pagesize和pageindex兩個參數,然後上傳給服務端接口獲取數據,而且網絡上也很少說明這種方式是否有問題,那到底有沒有問題呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"談到分頁,無論程序怎樣寫,分頁這個業務的核心動作是根據開始位置和結束位置來獲取一段數據,無論你的排序規則有多複雜,最終的目的總是獲取總列表數據中一段連續的數據。無論你是直接用的sql語句分頁,還用的搜索引擎(比如es),最終在客戶端體現的效果就是下一頁的數據展現。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然體現在客戶端的UI上的交互操作可以有很多樣式 "}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/01/01a5b760e1a87a34449b2183ef88d069.jpeg","alt":"image","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果是瀑布流或者app段滾動展示的方式,或者其他不需要數據總個數的情況下,菜菜認爲服務端千萬不要查詢這個總個數數據,展示方完全可以以下一頁有無數據作爲是否繼續拉取下一頁數據的依據。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"話題迴歸,如果客戶端依據pagesize和pageindex參數來進行分頁需求,有沒有問題呢?當然有,要不然菜菜寫這篇文章意義何在,我又不是一個喜歡愛扯淡的程序員~~"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"link","attrs":{"href":"#問題所在","title":null}},{"type":"text","text":"問題所在"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏以最簡單也是最基本的sql 語句分頁爲例,假如現在數據庫現有數據爲"}]},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"1,2,3,4,5,6,7\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"排序的規則是按照大小倒序,即數據的全部列表爲:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"7,6,5,4,3,2,1\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"假如現在是獲取第二頁數據,pagesize爲2,pageindex爲2,正確結果爲 “5,4” 。這無可厚非,在數據未發生改變的情況下,正確結果確實如此,那如果數據發生的變化呢,假如現在新加入一條數據 8,列表數據會變爲"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":null},"content":[{"type":"text","text":"8,7,6,5,4,3,2,1\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那依據以上分頁原則,第二頁獲取的數據就變爲了“6,5”,聰明的你是不是發現了問題,這也可能是D妹子引發加班的原因。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分頁的操作是建立在動態數據上的操作"}]}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"link","attrs":{"href":"#解決問題","title":null}},{"type":"text","text":"解決問題"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分頁操作的數據源是動態變動的,有時候變動的部分正好發生在你獲取的數據範圍內,就會發生數據重複或者錯誤的情況。那怎麼解決呢?"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"link","attrs":{"href":"#客戶端","title":null}},{"type":"text","text":"客戶端"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲數據的需求方和展示方,客戶端需要記住已經加載的數據的主鍵列表,如果某條數據已經展示過,根據業務需求來確定是否要重複展示,一般情況下需要去重。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果數據量非常大,客戶端維護一個數據池的方案其實也不夠理想"}]}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"link","attrs":{"href":"#服務端","title":null}},{"type":"text","text":"服務端"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":null,"normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"服務端分頁接口參數新增上一頁最後一條數據id參數lastId,去掉pageindex參數,因爲在多數情況下,pageindex參數在服務端的作用是確定數據的起點而已,如果有了lastid,pageinde在很多情況下其實已經不需要了。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"服務端把所有的數據做緩存,這樣動態數據在一定時間內靜態化,但是這樣也是治標不治本。"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"如果業務上對於排序無要求的話,服務端可以採用順序分頁,把獲取的數據落在不會變動的數據段上"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"服務端要想把動態的數據搞成靜態有點難度"}]}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"link","attrs":{"href":"#業務方","title":null}},{"type":"text","text":"業務方"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"無論程序怎麼優化也改變不了數據是在不停變動的本質,如果業務方(產品,運營)能夠接受數據在偶爾情況下能重複的現象,那能大幅度減少程序員的工作了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有時候你認爲的數據bug,在其他業務部門不一定是什麼重大問題"}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"link","attrs":{"href":"#領取架構師進階資料大禮包","title":null}},{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s/gQKStRKyHB_KOuDjyyodUw","title":null},"content":[{"type":"text","text":"領取架構師進階資料大禮包"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章