springboot-@Cache使用总结
基本使用
依赖jar包-pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yichen</groupId>
<artifactId>cache</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cache</name>
<description>cache</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.data</groupId>-->
<!-- <artifactId>spring-data-redis</artifactId>-->
<!-- <version>2.2.6.RELEASE</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
测试代码
controller
@RestController
@RequestMapping("/redis")
public class RedisController {
@Autowired
private CacheService cacheService;
@RequestMapping("/cache/get")
public String cacheGet(@RequestParam("name") String name){
String value=cacheService.get(name);
return value;
}
@RequestMapping("/cache/save")
public String cacheSave(@RequestParam("name") String name,@RequestParam("value") String value){
return cacheService.save(name,value);
}
@RequestMapping("/cache/delete")
public void cacheDelete(@RequestParam("name") String name){
cacheService.delete(name);
}
}
service
@Service
@Slf4j
public class CacheService {
@CachePut(value = "cache",key = "#name")
public String save(String name,String value){
log.info("加入缓存 key {} value {}",name,value);
return "6666";
};
@CacheEvict(value = "cache",key = "#name")
public void delete(String name){
log.info("删除缓存 key {}",name);
};
@Cacheable(value = "cache",key = "#name")
public String get(String name){
log.info("获取缓存值 key {}",name);
return null;
}
}
配置
# redis 配置信息,设置默认 database库为 9
spring.redis.password=yichen
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=9
# jedis 连接池配置信息
spring.redis.max.idle=10
spring.redis.max.total=30
spring.redis.max.wait.mills=-1
spring.cache.redis.time-to-live=60000
server.port=8070
启动类
这里记得加@EnableCaching
@SpringBootApplication
@EnableCaching
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class, args);
}
}
验证
写入缓存流程粗略分析
缓存拦截器 CacheInterceptor
CacheAspectSupport
execute方法,执行具体逻辑
374行开始为主要执行逻辑
获取执行结果
写入缓存
RedisCache
key值构造
写入缓存
后续可以逐步更近,基本就能看到写入缓存然后返回结果了。
奇奇怪怪的问题
save能成功但是get一直为空,且redis一直查不到key
问题原因
我设置的存活时间为2000
,spring.cache.redis.time-to-live=2000
。这里单位是毫秒,转换后即为2s
。手动查可能已经过了2s
了,此时key
已经失效。。