面试题答案
一键面试- 实现分页具体步骤
- 有序集合在Redis中可以使用
ZRANGE
或ZREVRANGE
命令。ZRANGE
用于从小到大返回有序集合指定区间内的成员,ZREVRANGE
则相反,从大到小返回。 - 对于分页展示,假设要获取第
page
页,每页pageSize
条数据。首先计算偏移量offset = (page - 1) * pageSize
。 - 然后使用
ZRANGE key start stop [WITHSCORES]
命令,其中start
为offset
,stop
为offset + pageSize - 1
。例如,要获取第一页(page = 1
),每页10条数据(pageSize = 10
),则start = 0
,stop = 9
,命令为ZRANGE mySortedSet 0 9 WITHSCORES
,这里mySortedSet
是有序集合的键名,WITHSCORES
选项可选择是否返回成员的分数。
- 有序集合在Redis中可以使用
- 确保分页数据准确性及处理边界情况
- 处理边界情况 - 数据量动态变化:
- 使用分数和成员值唯一标识:如果有序集合的分数不是唯一的,可能会导致分页数据不准确。确保分数唯一或者结合成员值来唯一标识数据。例如,在存储数据时,分数使用时间戳,成员值使用唯一ID。这样在数据量动态变化时,即使有新数据插入,只要分数和成员值组合唯一,分页数据能保持连贯。
- 记录上次查询的最后一条数据:每次分页查询时,记录返回结果中的最后一条数据的分数和成员值。当下次查询时,在
ZRANGE
命令中可以通过LIMIT
和WHERE
条件(如果Redis支持类似条件筛选),结合上次记录的数据,确保获取的数据是连贯的。例如,上次查询最后一条数据的分数为lastScore
,成员值为lastMember
,下次查询可以使用ZRANGEBYSCORE key (lastScore + 0.000001) +inf LIMIT 0 pageSize
(这里假设分数是浮点数,通过增加一个极小值来确保数据连贯)。
- 确保分页数据准确性:
- 验证数据量:在每次分页查询后,验证返回的数据量是否等于
pageSize
。如果小于pageSize
,说明可能到了数据末尾。例如在应用程序代码中,获取到分页数据后,检查len(pagedData) == pageSize
。 - 结合索引或计数:可以使用Redis的
ZCARD
命令获取有序集合的元素个数。通过这个总数和每页大小,可以预先计算出总页数,从而在前端展示分页导航时,能正确显示页码范围,避免用户访问不存在的页码。例如,totalElements = ZCARD mySortedSet
,totalPages = ceil(totalElements / pageSize)
,这里ceil
是向上取整函数。
- 验证数据量:在每次分页查询后,验证返回的数据量是否等于
- 处理边界情况 - 数据量动态变化: