使用 Spring Boot 和 Redis 实现分页查询

在现代应用程序中,数据的快速访问至关重要。Redis 作为一种高性能的键值数据库,常常被用于加速数据的读写操作。在本教程中,我们将学习如何在 Spring Boot 中实现基于 Redis 的分页查询功能。以下是我们将要涵盖的内容。

整体流程

首先,我们需要了解实现分页查询的整体流程。下面的表格展示了整个过程的步骤:

步骤 描述
步骤1 搭建 Spring Boot 项目并添加依赖
步骤2 配置 Redis 数据源
步骤3 创建数据实体类
步骤4 创建 Redis 访问接口
步骤5 实现分页查询逻辑
步骤6 测试分页查询功能

1. 搭建 Spring Boot 项目并添加依赖

我们首先需要一个 Spring Boot 项目。在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2. 配置 Redis 数据源

application.properties 中添加 Redis 的连接配置:

spring.redis.host=localhost
spring.redis.port=6379

这段代码配置了连接到本地 Redis 实例的地址和端口。

3. 创建数据实体类

接下来,我们需要定义一个数据实体类。以下以 User 为例:

import java.io.Serializable;

public class User implements Serializable {
    private String id;
    private String name;

    // Getter 和 Setter 方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这个 User 类包含用户的 idname 属性。它实现了 Serializable 接口,以便存储在 Redis 中。

4. 创建 Redis 访问接口

我们需要一个接口来处理 Redis 数据的存取。以下是一个示例接口:

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class UserRepository {
    private final RedisTemplate<String, User> redisTemplate;

    public UserRepository(RedisTemplate<String, User> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // 保存用户
    public void saveUser(User user) {
        redisTemplate.opsForValue().set(user.getId(), user);
    }

    // 获取所有用户
    public List<User> getAllUsers() {
        return redisTemplate.keys("*").stream()
                .map(redisTemplate.opsForValue()::get)
                .toList();
    }
}

在这个 UserRepository 中,我们定义了两个方法:saveUser 用于保存用户,getAllUsers 用于获取所有用户。

5. 实现分页查询逻辑

现在我们需要实现分页查询的逻辑:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    // 分页查询
    public List<User> getUsers(int page, int size) {
        List<User> allUsers = userRepository.getAllUsers();
        int start = Math.min(page * size, allUsers.size());
        int end = Math.min(start + size, allUsers.size());

        return allUsers.subList(start, end);
    }
}

UserService 中的 getUsers 方法实现了基本的分页逻辑。我们通过接收到的页码和每页的大小计算出开始和结束的索引,并使用 subList 方法返回指定范围的用户数据。

6. 测试分页查询功能

我们可以在 Controller 中测试我们的分页查询功能:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping
    public void addUser(@RequestBody User user) {
        userService.saveUser(user);
    }

    @GetMapping
    public List<User> getUsers(@RequestParam int page, @RequestParam int size) {
        return userService.getUsers(page, size);
    }
}

UserController 中,我们定义了两个接口:一个用于添加用户,另一个用于获取用户的分页数据。

关系图

以下是我们的数据结构关系图,展示了实体之间的关系:

erDiagram
    User {
        String id
        String name
    }

数据分布饼状图

假设我们的用户数据如下,其中 30% 的用户名为“John”,70% 的用户名为“Jane”。该饼状图展示了这部分数据的分布。

pie
    title 用户名分布
    "John": 30
    "Jane": 70

总结

通过以上步骤,我们成功地实现了一个基于 Spring Boot 和 Redis 的分页查询功能。总结一下,我们搭建了项目、配置了 Redis 数据源、创建了数据实体类及访问接口,并实现了分页查询逻辑。希望这篇教程对你有所帮助,如有疑问,欢迎随时交流!