沃梦达 / 编程技术 / 数据库 / 正文

SpringBoot使用Redis缓存MySql的方法步骤

当我们在使用Spring Boot开发Web应用时,通常会遇到需要缓存数据库查询结果的场景。在这种情况下,我们可以采用Redis作为缓存工具,以实现快速缓存和查询结果。下面是Spring Boot使用Redis缓存MySql的方法步骤的完整攻略:

当我们在使用Spring Boot开发Web应用时,通常会遇到需要缓存数据库查询结果的场景。在这种情况下,我们可以采用Redis作为缓存工具,以实现快速缓存和查询结果。下面是Spring Boot使用Redis缓存MySql的方法步骤的完整攻略:

1. 导入Redis和MySQL相关依赖

在Spring Boot项目中首先需要将Redis和MySQL相关依赖导入到项目中,具体可以在pom.xml中添加如下代码:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

2. 建立MySQL和Redis连接

在Spring Boot项目中,我们需要在application.properties中配置MySQL和Redis的相关信息,如下所示:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.redis.host=localhost
spring.redis.port=6379

3. 编写MySql查询接口

在Spring Boot项目中我们需要编写MySql查询接口,查询接口的返回值可以是List,Map,Object等类型,如下所示:

@Repository
public class MyDao {
    @Autowired
    public DataSource dataSource;

    public List<Map<String, Object>> query(String sql, Object... args) {
        List<Map<String, Object>> result = new ArrayList<>();
        try (Connection conn = dataSource.getConnection()) {
            PreparedStatement ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Map<String, Object> row = new HashMap<>();
                ResultSetMetaData metaData = rs.getMetaData();
                for (int i = 1; i <= metaData.getColumnCount(); i++) {
                    row.put(metaData.getColumnName(i), rs.getObject(i));
                }
                result.add(row);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return result;
    }
}

4. 编写Redis缓存接口

在Spring Boot项目中我们需要编写Redis缓存接口,这里采用RedisTemplate实现,如下所示:

@Repository
public class RedisDao {
    @Autowired
    private RedisTemplate redisTemplate;

    public void put(Object key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object get(Object key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void delete(Object key) {
        redisTemplate.delete(key);
    }
}

5. 实现缓存查询

在Spring Boot项目中,我们可以通过使用@Cacheable标签来开启Redis缓存查询,如下所示:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private MyDao myDao;

    @Autowired
    private RedisDao redisDao;

    @RequestMapping("/query")
    @Cacheable(value = "userCache", key = "#sql")
    public List<Map<String, Object>> query(String sql) {
        Object cachedValue = redisDao.get(sql);
        if (cachedValue != null) {
            return (List<Map<String, Object>>) cachedValue;
        }
        List<Map<String, Object>> result = myDao.query(sql);
        redisDao.put(sql, result);
        return result;
    }
}

上述代码中,@Cacheable标签中的value参数表示缓存名称,key参数表示缓存的键名,这里以sql为键名进行缓存查询,如果缓存中存在对应的结果,则直接返回缓存结果,否则调用MySql查询接口进行查询,并将结果存储到缓存中。

6. 示例说明

示例一:查询所有用户信息

首先需要在MySQL数据库中建立如下用户信息表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

然后向表中插入如下数据:

INSERT INTO `user` (`name`, `age`) VALUES ('张三', 18), ('李四', 20), ('王五', 22);

接下来查询所有用户信息:

@Test
public void queryAllUserTest() {
    List<Map<String, Object>> result = userController.query("SELECT * FROM user");
    System.out.println(result);
}

输出如下:

[{age=18, id=1, name=张三}, {age=20, id=2, name=李四}, {age=22, id=3, name=王五}]

示例二:查询指定年龄段的用户信息

接下来查询年龄在18-20岁之间的用户信息:

@Test
public void queryUserByAgeTest() {
    List<Map<String, Object>> result = userController.query("SELECT * FROM user WHERE age >= ? AND age <= ?", 18, 20);
    System.out.println(result);
}

输出如下:

[{age=18, id=1, name=张三}, {age=20, id=2, name=李四}]

通过上面两个示例可以发现,使用Spring Boot结合Redis缓存MySql查询结果可以有效地提高查询效率并且减轻数据库的负担。

本文标题为:SpringBoot使用Redis缓存MySql的方法步骤

基础教程推荐