偶然在代碼中發現一個接口,接口定義說是分頁查詢,但邏輯實現是Redis。不太理解,Redis怎么分頁?后來看到一篇文章,然后了解了。
1、Zrevrange實現
通過SortedSet的zrevrange topicId (page-1)×10 (page-1)×10+perPage指令可以實現分頁功能。
Redis Zrevrange 命令 - 返回有序集中指定區間內的成員,通過索引,分數從高到底。
參考:Redis Zrevrange 命令_返回有序集中指定區間內的成員,通過索引,分數從高到底
詳細了解見原文:在 Redis 中進行分頁排序查詢 | NiuNiu's Note
注:Zrevrange 命令后面的命令值就是索引值。所以不會有問題。
思考:可能會有一個小問題。如果在分頁查詢過程中,有新數據插入。那么已有數據的索引值會改變,這樣就會查到重復數據或者遺失數據了。
而Zrevrangebyscore,如果將數據插入時間點作為score,那么通過score來划分范圍,肯定不會出現數據重復或丟失的情況。
2、Zrevrangebyscore命令實現
另外,我們的代碼中使用的是Zrevrangebyscore命令。
這個命令應該只保證每頁范圍一致,做到不遺漏數據,但不保證每頁數據總數一定。
一般不適用於傳統每頁多少條數據的分頁方式,比較適合於瀑布流或者評論那種動態加載數據的方式。
注:Zrevrangebyscore 命令后面的命令值就是分數值。所以有數據總數不一致情況。
3、參考:
- 在 Redis 中進行分頁排序查詢 | NiuNiu's blog
http://liu-xin.me/2015/11/17/%E5%9C%A8Redis%E4%B8%AD%E8%BF%9B%E8%A1%8C%E5%88%86%E9%A1%B5%E6%8E%92%E5%BA%8F%E6%9F%A5%E8%AF%A2/