redis本身是自帶分頁功能的,zrevrange 可以按照成員從小到大的順序來返回每頁的數據的,如果是從大到小的話使用另外命令zrevrange。
使用場景:用戶的發帖列表中,使用zadd 添加到有序集合中去?
redis> zadd key score
現在設置score和帖子id的值一致,這樣保證score不能重復方便排序。正常情況下通過 zrevrange 即可完成分頁
redis>zrevrange start end
那么問題來了:
如果在我查詢第一頁(最新的排列在最新)后有新的數據進入,那么查詢第二頁的start 和end
就會出現問題,簡單一點說就是第二頁的第一個數據和插入數據一起的第一頁的最后一個數據是同樣的數據!
如何解決上面問題?
比如我們在查詢第一頁的數據存儲的順序是這樣的
80 ?80
79 79
78 78?
77 77?
76 76?
......
查詢第二頁的數據變成
82 ?82
81 81
80 80?
79 79?
78 78?
.....
那么每次查詢都要知道當前的位移是多少(目前只考慮了新增帖子的情況,刪除帖子的情況頻率比較低暫時忽略)?
幸虧redis提供了,zcount 返回有序集key中,score值在min和max之間(默認包括score值等于min或max)的成員的數量。我們可以在第一頁的時候獲得最大值當做acount的min,然后預估max得到的數就是分頁需要偏移的數量。
然后通過
zcount $min $max //獲得
zrevrange start+position end+position
獲得相對比較準確的數據。
如果有問題歡迎指教,謝謝!