国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Redis中SortSet使用不當導致的分頁(yè)Bug怎么解決

發(fā)布時(shí)間:2021-09-14 18:13 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 服務(wù)器 歡迎投稿:712375056

這篇文章主要講解了“中SortSet使用不當導致的分頁(yè)Bug怎么解決”,文中的講解內容簡(jiǎn)單清晰,易于學(xué)習與理解,下面請大家跟著(zhù)小編的思路慢慢深入,一起來(lái)研究和學(xué)習“Redis中SortSet使用不當導致的分頁(yè)Bug怎么解決”吧!

首先,我們線(xiàn)上的電商系統正在進(jìn)行一個(gè)大促活動(dòng)。買(mǎi)家非常的多,導致一時(shí)間產(chǎn)生了非常多的評論。開(kāi)發(fā)人員在存儲(保存)評論時(shí),使用 Redis 中的 SortSet 這個(gè)數據結構。每新增一條評論,他都通過(guò) zadd 命令將起保存至 Redis 和 中,查詢(xún)時(shí)直接在 Redis 中取出來(lái)。代碼抽象一下,如下所示:

順便說(shuō)一下,System.currentTimeMillis() 是毫秒,System.currentTimeMillis() / 1000 就相當于精確到秒。

這個(gè)活動(dòng)是大促,參與活動(dòng)的需要評論?;顒?dòng)比預期的熱,導致同一秒的評論就比較多,導致 zrangeByScoreWithScores 在取出評論列表時(shí),遇到同一秒的超過(guò) 10 條的評論,就會(huì )出現重復數據。

取出評論列表的邏輯大致抽象如下:

看到?jīng)]?他每次拿 lastScore 記錄,也就是上一頁(yè)評論的最后一條數據的時(shí)間。來(lái)獲取新的 10 條評論數據。由于同一秒評論的記錄超過(guò) 10 條后,導致每次 APP 每次下拉刷新獲取到重復數據的概率比較高。于是就有客戶(hù)投訴,看評論中的數據都是一樣的。無(wú)論怎么刷新都是 10 條一樣的數據,和上一頁(yè)的數據一樣。

這個(gè) zrangeByScoreWithScores 其實(shí)就是 Redis 中的 ZREVRANGEBYSCORE 指令。完整指令如下:

其中這個(gè) limit 是可以分頁(yè)的。這個(gè)分頁(yè)對下拉刷新也有一個(gè)問(wèn)題,那就是在你下拉刷新時(shí),剛好新增了幾個(gè)評論,所以刷新出來(lái)的數據也可能有重復的數據。

后來(lái)這個(gè)程序員針對這個(gè)問(wèn)題有改了一下,每次拿到 lastScore 后加 1。我看到這個(gè)代碼后,又找他了,這個(gè)做法肯定不行的。也就是說(shuō)你每次拿到上一頁(yè)最后一條的 lastScore 后,再加 1。就相當與時(shí)間上加了 1 秒,中間肯定會(huì )漏掉一些數據的。

那么該怎么辦呢?如果你想使用 lastScore 進(jìn)行分頁(yè),就必須保證它唯一。不然就有概率發(fā)生刷新列表時(shí),出現重復數據。

我們這個(gè)和時(shí)事新聞還有些不一樣,新聞的寫(xiě)入時(shí)間重復概率沒(méi)有我們這個(gè)高。尤其是我們在大促的活動(dòng)當中。

最后說(shuō)一下這個(gè)問(wèn)題的解決辦法。一種就是保證 lastScore 唯一,或者說(shuō)時(shí)間在進(jìn)一步精確。還有一種就是 lastScore + limit 的組合來(lái)實(shí)現分頁(yè)?;蛘呔褪菃渭兊氖褂?limit 來(lái)實(shí)現,但是也要注意不能刷新出重復數據。

我們的做法,最終是參考了上圖。

將每個(gè)主題的 topicId 作為 set 的 key,將與該主題關(guān)聯(lián)的評論的 createDate 和 commentId 分別作為 set 的 score 和 member,commentId 的順序就根據 createDate 的大小進(jìn)行排列。

當需要查詢(xún)某個(gè)主題某一頁(yè)的評論時(shí),就可主題的 topicId 通過(guò)指令 zrevrange topicId (page-1)×10 (page-1)×10+perPage 這樣就能找出某個(gè)主題下某一頁(yè)的按時(shí)間排好順序的所有評論的 commintId。page 為查詢(xún)第幾頁(yè)的頁(yè)碼,perPage 為每頁(yè)顯示的條數。

當找到所有評論的 commentId 后,就可以把這些 commentId 作為 key 去 Hash 結構中去查詢(xún)該條評論對應的內容。

這樣就利用 SortSet 和 Hash 兩種結構在 Redis 中達到了分頁(yè)和排序的目的。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

一本久久精品一区二区| 丰满少妇人妻无码专区| 亚洲色偷偷综合亚洲AVYP| 99久久人人爽亚洲精品美女| 精品日韩亚洲AV无码| 国产成人久久AV免费看|