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

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

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比亳州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式亳州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋亳州地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

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

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

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

這個活動是大促,參與活動的需要評論。活動比預期的熱,導致同一秒的評論就比較多,導致 zrangeByScoreWithScores 在取出評論列表時,遇到同一秒的超過 10 條的評論,就會出現(xiàn)重復數(shù)據(jù)。

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

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

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

這個 zrangeByScoreWithScores 其實就是 Redis 中的 ZREVRANGEBYSCORE 指令。完整指令如下:

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

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

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

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

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

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

我們這個和時事新聞還有些不一樣,新聞的寫入時間重復概率沒有我們這個高。尤其是我們在大促的活動當中。

最后說一下這個問題的解決辦法。一種就是保證 lastScore 唯一,或者說時間在進一步精確。還有一種就是 lastScore + limit 的組合來實現(xiàn)分頁。或者就是單純的使用 limit 來實現(xiàn),但是也要注意不能刷新出重復數(shù)據(jù)。

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

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

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

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

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

這樣就利用 SortSet 和 Hash 兩種結(jié)構(gòu)在 Redis 中達到了分頁和排序的目的。

感謝各位的閱讀,以上就是“Redis中SortSet使用不當導致的分頁Bug怎么解決”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Redis中SortSet使用不當導致的分頁Bug怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

網(wǎng)站名稱:Redis中SortSet使用不當導致的分頁Bug怎么解決
URL標題:http://muchs.cn/article4/pdjsie.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、網(wǎng)站建設、App設計小程序開發(fā)、商城網(wǎng)站做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設