在开发过程中,为了提高访问的效率,不免会用到redis。比如本例子中使用某种条件去查询某种数据,但是每次去数据库中查询速度会很慢,此时可以考虑将第一次查询的结果放到redis缓存中,当第二次查询的时候,直接从redis缓存中取就可以。
redis中事key-value。所以可以考虑将查询条件作为key,所以这里拿查询条件作为key写了个通用的方方,即key的生成策略。当让每个方法都将查询的条件转成字符串这样写也可以,但是抽出来,这样能做到代码的公用,减少冗余代码。
注意要现在启动类中加上启动缓存的注解@EnableCaching
![在这里插入图片描述](https://img-blog.csdnimg.cn/3767ff379d7149ef97768a81a73d54c1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pif56m6MTAyNA==,size_20,color_FFFFFF,t_70,g_se,x_16)
/**
* @author qiuhongyu
* @date 2022/4/7 14:46
*/
@RestController
public class DemoController {
private DemoService demoService;
@PostMapping("/demo")
public void demo(@RequestBody QueryInfoRequest queryInfoRequest) {
demoService.getInfo(queryInfoRequest);
}
}
package com.example.leardemo;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* @author qiuhongyu
* @date 2022/4/7 14:46
*/
@Service
public class DemoService {
//将请求参数作为查询的条件, value文件夹名,keyGenerator通过主键生成策略生成redis的主键
@Cacheable(value = "demo:quest", keyGenerator = DefaultCacheableKeyGenerator.NAME)
public String getInfo(QueryInfoRequest queryInfoRequest) {
//处理业务逻辑,如:从数据库中查询除业务中需要的数据,将页面中需要的数据反给前端
return null;
}
}
package com.example.leardemo;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* @author qiuhongyu
* @date 2022/4/7 14:52
*
* redis主键生成策略
*
*/
@Component(DefaultCacheableKeyGenerator.NAME)
public class DefaultCacheableKeyGenerator implements KeyGenerator {
//从配置文件中读取application中使用那种环境,dev,sit,prod,便于区分是在哪个环境下,根据自己需求定。
// @Value("${spring.profiles.active}")
// private String active;
private String active;
public static final String NAME = "defaultCacheableKeyGenerator";
@Override
public Object generate(Object target, Method method, Object... params) {
//此处一大段可以根据自己的业务需求来,比如还可以添加上一些登录用户的id等信息等等
StringBuilder key = new StringBuilder(active);
key.append(":").append(method.getName());
for (Object param : params) {
if(param != null) {
key.append(":")
.append(param.toString());
}
}
return key.toString();
}
}
查询条件
package com.example.leardemo;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
/**
* @author qiuhongyu
* @date 2022/4/7 14:56
*
* 查询条件请求参数
*/
@Data
@ToString
public class QueryInfoRequest implements Serializable {
private static final long serialVersionUID = 8295461128875889050L;
/**
* 性别
*/
private String sex;
/**
* 年龄
*/
private String age;
}
// 如果不用抽出来的策略也可以,那么写法就类似下面的这种,key中QueryInfoRequest 要重写toString
@Cacheable(value = "demo:quest",key = "#queryInfoRequest")
public String getInfo(QueryInfoRequest queryInfoRequest) {
}
// 也可以指定对象中的哪个属性作为key
@Cacheable(value = "demo:quest",key = "#queryInfoRequest.age + '':" + #queryInfoRequest.sex)
public String getInfo(QueryInfoRequest queryInfoRequest) {
//
return null;
}
需要用到的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--整合spring cache的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- springboot 整合redis的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis缓存管理器用来序列化和反序列化 缓存内容所使用到的一个依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>```
配置文件中
server:
port: 8090
spring:
cache:
type: REDIS
redis:
host: localhost
jedis:
pool:
max-active: 10
max-idle: 10
max-wait: 3000ms
min-idle: 20
port: 6379
timeout: 3000ms
database: 0