**Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持JCache(JSR-107)注解简化开发**
当配置上redis之后缓存注解就会将缓存内容存储在redis内,没有redis的时候会存储在spring中
1.缓存注解与接口
1.Cache:缓存接口,定义缓存操作,实现类有RedisCache,EhCache,ConcurrentMapCache 等
2.CacheManager:缓存管理器,管理各种缓存组件
3.@Cacheable :主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
4.@CachePut :在方法被调用的时候将结果缓存
5.@CacheEvict :清空缓存
6.@EnableCaching:开启基于注解的缓存
7.keyGenerator:缓存数据时key生成的策略
8.serialize:缓存数据时value序列话策略
2.@Cacheable:
@Cacheable可以标记在一个方法上,也可以标记在一个类上,标记在方法上时表示这个方法是支持缓存的,标记在类上表示这个类中所有的方法都支持缓存
Spring会在其被调用后**将其返回值缓存起来**,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法
Spring在缓存方法的返回值时是**以键值对进行缓存的**,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略
**当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的**
1.1@Cacheable的cacheNames/value属性
cacheNames属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个**Cache也可以是多个Cache**,**当需要指定多个Cache时其是一个数组**
@Cacheable(cacheNames="cache1") public String sc(){ return "aaa"; //将值aaa存到了cache1里 }
@Cacheable(cacheNames={"cache1","cache2"}) public String sc(){ return "aaa"; }
1.2@Cacheable的key属性
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key
自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接**使用“#参数名”或者“#p参数index”**
1.设置为当前方法名:#root.methodName
2.当前被调用的目标对象:#root.target
3.当前被调用用的目标对象:#root.targetClass
4.当前方法中的对象:#root.args[0]
5.自定义Key
@Cacheable(value="cache1",key="#id") //这个是声明了一个id public String sc(){ return "aaa"; } @Cacheable(value="cache1",key="#p0")//这个相当于设置的下标 public String sc(){ return "aaa"; } @Cacheable(value="cahae1",key="#id.aa")//这个相当于对象的一个属性 public String sc(){ return "aaa"; } @Cacheable(value="cache1",key="#p0.aa") public String sc(){ return "aaa"; }
![](https://img2020.cnblogs.com/blog/1534700/202009/1534700-20200923100210028-1252321275.png)
1.3 condition:当满足条件时进行缓存
@Cacheable(condition="i>0") public void sc(int i){ }
1.4 unless :当满足条件时不进行缓存
@Cacheable(unless= "#result == null") public int sc(int i){ return 100; }
可以使用#result来调用返回值
3.@CachePut 修改缓存
在使用@CachPut注解的时候要设定和查询方法一样的key,不然当进行修改的时候修改成功但是key不同他会查不到
@Cachable(value={"test"},key="#id") public Result select(String id){ return value; } @CachPut(value={"test"},key="#root.args[0].id") public Result update(User user){ return value; }
这样的话两个key是一样的,删除也是同理
4.@CacheEvict 删除缓存
4.1根据key删除
@CacheEvict(value="test",key="#id")//这个是根据key删除 public Result delete(String id){ }
4.2删除全部(默认关闭)
@CacheEvict(value="test",allEntries=true) public void delete(String id){ }