Springboot使用@Cachable,首先一定要在启动类上面加上@EnableCaching很重要,不然缓存不上. 并且我们要只带caching是org.springframework包下的.
@SpringBootApplication
@MapperScan(basePackages = {"com.example.redis"})
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
其次需要在配置文件里面指定caching的缓存服务端
spring.cache.type=redis # caching的缓存客户端是redis
public class CachingTest{
// 切记,这里的key如果是字符串一定要在双引号
// 里面加上单引号否则会报错,如果使用el表达式就不需要
// 单引号 如:key = "#id",unless是指是否不缓存本次数据.
@Cacheable(cacheNames = {"test1"},
key = "'key1'",unless = "false")
public String show(){
Return "返回值就是存入缓存的值";
}
// 注意:在请求@CachePut注释的方法时不会先去缓存里面查询
// 是否有当前key的值,而是直接执行方法然后存入缓存中,
// 也就是如果缓存有了key的值就是更新没有就添加.
// condition这里的意思就是当前是否要缓存到reids里面true缓存false不缓存
@CachePut(cacheNames = {"test1"},key = "'key2'",condition = "true")
public String show2(){
Return "show2的缓存值";
}
}
看一下缓存里面的存入数据的结构
可以看到我们规定的cacheNames就是最外层的文件夹名,key就是这个文件夹下的一个key名,值就是key对应的值.
// 设置缓存过期时间
spring:
cache:
redis:
time-to-live: 毫秒值
1:注意事项:我们可以注意到@Cacheable有一个unless属性该属性true的时候就不缓存本次返回值.
2:当请求被@Cacheable注释的方法时,会先去缓存服务端查询是否有当前key的缓存,如果有就不执行当前方法,而是直接返回缓存的内容!!!
3:@Cacheable和@Cacheput不建议同时使用在一个方法上,因为@Cacheable是否缓存本次数据是更具unless控制,而@Cacheput如果没有其他属性控制,是一定会去更新或新增本次返回值.
4:很多同学注意到test1下面有一级空目录,这里的空目录其实是@Cacheable的命名规范:通过下面的key名字我们可以发现这里有两个冒号但其实我们平常只有一个冒号,这个空目录就是多出来的冒号导致,这个不用过多关注这个是@Cacheable自己的问题
5:如果两次请求的接口里面的参数相同那么就会直接请求缓存,反之就走代码逻辑,这里的参数相同是指上面存到redis里面的key值相同即可
6:在使用缓存的这些注解的时候切记要使用代理对象去调用否则是没办法生效的,因为这个实现也是基于aop的!