這篇文章主要講解了“中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í)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站