在开发过程中,为了提高访问的效率,不免会用到redis。比如本例子中使用某种条件去查询某种数据,但是每次去数据库中查询速度会很慢,此时可以考虑将第一次查询的结果放到redis缓存中,当第二次查询的时候,直接从redis缓存中取就可以。
redis中事key-value。所以可以考虑将查询条件作为key,所以这里拿查询条件作为key写了个通用的方方,即key的生成策略。当让每个方法都将查询的条件转成字符串这样写也可以,但是抽出来,这样能做到代码的公用,减少冗余代码。
注意要现在启动类中加上启动缓存的注解@EnableCaching

/**
* @author qiuhongyu
* @date 2022/4/7 14:46
*/@RestControllerpublicclassDemoController{privateDemoService demoService;@PostMapping("/demo")publicvoiddemo(@RequestBodyQueryInfoRequest queryInfoRequest){
demoService.getInfo(queryInfoRequest);}}
packagecom.example.leardemo;importorg.springframework.cache.annotation.Cacheable;importorg.springframework.stereotype.Service;/**
* @author qiuhongyu
* @date 2022/4/7 14:46
*/@ServicepublicclassDemoService{//将请求参数作为查询的条件, value文件夹名,keyGenerator通过主键生成策略生成redis的主键@Cacheable(value="demo:quest", keyGenerator=DefaultCacheableKeyGenerator.NAME)publicStringgetInfo(QueryInfoRequest queryInfoRequest){//处理业务逻辑,如:从数据库中查询除业务中需要的数据,将页面中需要的数据反给前端returnnull;}}
packagecom.example.leardemo;importorg.springframework.cache.interceptor.KeyGenerator;importorg.springframework.stereotype.Component;importjava.lang.reflect.Method;/**
* @author qiuhongyu
* @date 2022/4/7 14:52
*
* redis主键生成策略
*
*/@Component(DefaultCacheableKeyGenerator.NAME)publicclassDefaultCacheableKeyGeneratorimplementsKeyGenerator{//从配置文件中读取application中使用那种环境,dev,sit,prod,便于区分是在哪个环境下,根据自己需求定。// @Value("${spring.profiles.active}")// private String active;privateString active;publicstaticfinalString NAME="defaultCacheableKeyGenerator";@OverridepublicObjectgenerate(Object target,Method method,Object... params){//此处一大段可以根据自己的业务需求来,比如还可以添加上一些登录用户的id等信息等等StringBuilder key=newStringBuilder(active);
key.append(":").append(method.getName());for(Object param: params){if(param!=null){
key.append(":").append(param.toString());}}return key.toString();}}
查询条件
packagecom.example.leardemo;importlombok.Data;importlombok.ToString;importjava.io.Serializable;/**
* @author qiuhongyu
* @date 2022/4/7 14:56
*
* 查询条件请求参数
*/@Data@ToStringpublicclassQueryInfoRequestimplementsSerializable{privatestaticfinallong serialVersionUID=8295461128875889050L;/**
* 性别
*/privateString sex;/**
* 年龄
*/privateString age;}
// 如果不用抽出来的策略也可以,那么写法就类似下面的这种,key中QueryInfoRequest 要重写toString@Cacheable(value="demo:quest",key="#queryInfoRequest")publicStringgetInfo(QueryInfoRequest queryInfoRequest){}
// 也可以指定对象中的哪个属性作为key@Cacheable(value="demo:quest",key="#queryInfoRequest.age + '':"+ #queryInfoRequest.sex)publicStringgetInfo(QueryInfoRequest queryInfoRequest){//returnnull;}
需要用到的依赖
<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