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
获得相对比较准确的数据。
如果有问题欢迎指教,谢谢!