Redis本身没有直接供应分页功能,但是Redis的List类型数据支持了基于索引范围的查询,而在Redis中的分页查询也正是利用了这一特性来实现。一样平常情形下,我们可以利用Redis的LRANGE命令来分页查询干系操作,通过LRANGE命令可以根据起始和结束索引来获取Redis列表的某一段内容,因此,我们可以通过设置不同的起始和结束索引来实现分页。
下面我们就来详细先容一下干系操作如何实现。
首先确保在项目中已经引入了Redis干系的依赖并完成了Redis连接配置,如下所示。

spring.redis.host=localhostspring.redis.port=6379spring.redis.database=0
编写分页查询逻辑
我们可以利用RedisTemplate或StringRedisTemplate来进行操作,这里我们假设Redis中的列表key为user:list,如下面我们就来看看如何通过RedisTemplate来实现分页查询操作。
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class RedisListService { @Autowired private RedisTemplate<String, Object> redisTemplate; / 对 Redis List 进行分页查询 @param key Redis List 的键 @param pageNumber 当前页数,从 1 开始 @param pageSize 每页显示条数 @return 返回分页查询结果 / public List<Object> getPaginatedList(String key, int pageNumber, int pageSize) { // 打算起始索引 int start = (pageNumber - 1) pageSize; // 打算结束索引 int end = start + pageSize - 1; // 利用 LRANGE 命令进行分页查询 List<Object> paginatedList = redisTemplate.opsForList().range(key, start, end); return paginatedList; }}
调用分页查询方法
接下来我们就可以通过调用getPaginatedList方法来获取指定页的数据,如下所示,查询第 2 页,每页显示 5 条数据。
@RestController@RequestMapping("/users")public class UserController { @Autowired private RedisListService redisListService; @GetMapping("/page") public List<Object> getUserPage(@RequestParam int page, @RequestParam int size) { // 调用分页查询方法 List<Object> users = redisListService.getPaginatedList("user:list", page, size); return users; }}
这样,当我们访问 /users/page?page=2&size=5 时,系统会返回 Redis 中 user:list 列表的第 2 页,每页 5 条记录的数据。
获取总条数和页码信息的改进如果须要将分页的总条数和页码等信息一同返回,可以这样实现
public class PageResult<T> { private long total; private int pageNumber; private int pageSize; private List<T> data; // 布局方法、getter、setter}public PageResult<Object> getPaginatedListWithTotal(String key, int pageNumber, int pageSize) { // 打算起始索引 int start = (pageNumber - 1) pageSize; int end = start + pageSize - 1; // 获取分页数据 List<Object> paginatedList = redisTemplate.opsForList().range(key, start, end); // 获取总条数 Long total = redisTemplate.opsForList().size(key); PageResult<Object> result = new PageResult<>(); result.setData(paginatedList); result.setTotal(total != null ? total : 0); result.setPageNumber(pageNumber); result.setPageSize(pageSize); return result;}
总结
利用Redis的LRANGE命令和Spring Data Redis供应的RedisTemplate,可以轻松实现对Redis中List数据的分页查询操作。通过打算页码和每页大小来确定起始和结束索引,然后调用range方法即可实现分页查询。LRANGE操作在Redis中是一个常数韶光繁芜度操作,性能较好,但如果数据量非常大时,分页要求的频率要合理,以避免对Redis做事器造成过多压力。