mysql 游標分頁 基於游標的分頁介面實現

2021-10-20 22:31:07 字數 1841 閱讀 8381

分頁介面的實現,在偏業務的服務端開發中應該很常見,pc時代的各種**,移動時代的各種feed流、timeline。

出於對流量的控制,或者使用者的體驗,大批量的資料都不會直接返回給客戶端,而是通過分頁介面,多次請求返回資料。

而最常用的分頁介面定義大概是這樣的:

router.get('/list', async ctx => = this.query

ctx.body = )

// 過濾所需要的函式,會在下方列出來

yield filterdata(results)

} while (index++ < count)

}複製**

同時,我們還需要有乙個過濾資料的函式,這些函式可能會從一些其他資料來源獲取資料,用來校驗列表資料的合法性,比如說,使用者a有乙個黑名單,裡邊有使用者b、使用者c,那麼使用者a訪問介面時,就需要將b和c進行過濾。

抑或是我們需要判斷當前某條資料的狀態,例如主播是否已經關閉了直播間,推流狀態是否正常,這些可能會呼叫其他的介面來進行驗證。

// 過濾資料的函式

async function filterdata (list)`), redis.sismember(`***:black:list`, item.id)

// 正確的狀態

if (islive && !inblacklist) = this.query

const data = await generateddata({

cursor,

size,

ctx.body = {

code: 200,

data,

複製**

這樣的結構返回值大概是,乙個list與乙個cursor,類似scan的返回值,游標與資料。

客戶端還可以傳入可選的size來指定一次介面期望的返回條數。

不過相對於普通的page+size分頁方式,這樣的介面請求勢必會慢一些(因為普通的分頁可能一頁返回不了固定條數的資料,而這個在內部可能執行了多次獲取資料的操作)。

不過用於一些實時性要求強的介面上,我個人覺得這樣的實現方式對使用者會更友好一些。

兩者之間的比較

這兩種方式都是很不錯的分頁方式,第一種更常見一些,而第二種也不是靈丹妙藥,只是在某些情況下可能會好一些。

第一種方式可能更多的會應用在b端,一些工單、報表、歸檔資料之類的。

而第二種可能就是c端用會比較好一些,畢竟提供給使用者的產品;

在pc頁面可能是乙個分頁**,第乙個展示10條,第二頁展示出來8條,但是第三頁又變成了10條,這對使用者體驗來說簡直是個災難。

而在移動端頁面可能會相對好一些,類似無限滾動的瀑布流,但是也會出現使用者載入一次出現2條資料,又載入了一次出現了8條資料,在非首頁這樣的情況還是勉強可以接受的,但是如果首頁就出現了2條資料,嘖嘖。

而用第二種,游標cursor的方式能夠保證每次介面返回資料都是size條,如果不夠了,那就說明後邊沒有資料了。

對使用者來說體驗會更好一些。(當然了,如果列表沒有什麼過濾條件,就是乙個普通的展示,那麼建議使用第一種,沒有必要新增這些邏輯處理了)

小結當然了,這只是從服務端能夠做到的一些分頁相關的處理,但是這依然沒有解決所有的問題,類似一些更新速度較快的列表,排行榜之類的,每秒鐘的資料可能都在變化,有可能第一次請求的時候,使用者a在第十名,而第二次請求介面的時候使用者a在第十一名,那麼兩次介面都會存在使用者a的記錄。

針對這樣的情況,客戶端也要做相應的去重處理,但是這樣一去重就會導致資料量的減少。

這又是乙個很大的話題了,不打算展開來講。。

乙個簡單的欺騙使用者的方式,就是一次介面請求16條,展示10條,剩餘6條存在本地下次介面拼接進去再展示。

文中如果有什麼錯誤,或者關於分頁各位有更好的實現方式、自己喜歡的方式,不妨交流一番。

參考資料

mysql游標的型別 MySQL 游標

以下的文章主要介紹的是mysql游標的使用筆記,其可以用在儲存過程的sql語句,其主要型別主要有以下幾種,以下就是對其詳細介紹,相信如果你掌握了這項技術,會在以後的學習或是工作中帶來很大的幫助。1 無返回結果語句,如 insert,update,drop,delete等 2 select語句返回單行...

mysql游標切換 MySQL游標的使用

在編寫儲存過程時,查詢可能返回多條記錄,如果,資料量非常大,則需要使用游標來逐條讀取查詢結果集中的記錄 游標,是一種用於輕鬆處理多行資料的機制 游標的宣告 使用游標處理結果集中的資料,需要先宣告游標 游標,必須宣告在宣告變數 條件之後,宣告處理程式之前 mysql中,使用declare關鍵字來宣告游...

mysql 游標的使用

可以用在儲存過程的sql語句主要有以下型別 1 無返回結果語句,如 insert,update,drop,delete等 2 select語句返回單行變數並可傳給本地變數 select into 3 返回多行結果集的select語句,並可使用游標迴圈處理 注意,儲存過程返回的多行結果集,可以被客戶端...