当我们在使用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的方法步骤 - Python技术站