SpringCache缓存

一、概述

SpringCache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用SpringCache还需要配合具体的缓存实现来完成。
虽然如此,但是SpringCache是所有Spring支持的缓存结构的基础,而且所有的缓存的使用最后都要归结于SpringCache。

二、缓存注解

SpringCache缓存功能的实现是依靠下面的这几个注解完成的。

  • @EnableCaching:开启缓存功能
  • @Cacheable:定义缓存,用于触发缓存
  • @CachePut:定义更新缓存,触发缓存更新
  • @CacheEvict:定义清除缓存,触发缓存清除
  • @Caching:组合定义多种缓存功能
  • @CacheConfig:定义公共设置,位于class之上

1、@CacheConfig

该注解标注于之上,用于配置该类中会用到的一些公共的缓存相关配置。
@CacheConfig(cacheNames = “pers.liuchengyin.service.blogServiceImpl”)
cachNames的值pers.liuchengyin.service.blogServiceImpl就是这个类公共的缓存对象,就相当于一个名为pers.liuchengyin.service.blogServiceImplMap对象,下文简称对象

2、@Cacheable

用在查询的方法上,方法的返回值将被加入缓存。该注解标注的方法每次被调用前都会触发缓存校验,校验指定参数的缓存是否已存在(已发生过相同参数的调用),若存在,直接返回缓存结果,否则执行方法内容,最后将方法执行结果保存到缓存中。

该注解有这些参数:valuecacheNameskeyconditionunlesskeyGeneratorcacheManagercacheResolver

valuecacheNames是两个同等的参数。cacheNames是Spring4新增的,作为value的别名,用于指定缓存对象,不是必须指定的。如果不指定则使用上面配置的CacheConfig配置的cacheNames

key就是缓存对象存储在Map集合中的key值,不是必需,缺省按照方法的所有参数组合作 为key值, 可以自己配置,但需要SpEL表达式。比如

@Cacheable(key = "#p0")    // 表示第一个参数作为缓存的key值
getBlog(Integer id, String name){}
@Cacheable(key = "#id")    // 也可以用参数名作为缓存的key值,这里的参数是id
getBlog(Integer id, String name){}
@Cacheable(key = "#user.id")   // 甚至可以用对象里的某个属性作为key值
getBlog(Integer id, User user){}

condition缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存。比如

@Cacheable(key = "#p0",condition = "#username.lenth < 3")
getBlog(Integer id, String username){}		// 只有第二个参数长度小于3的时候才缓存进去

unlesscondition相似,但unless是方法被调用之后才做判断的,所以可以对结果result进行判断是否去缓存。

keyGenerator用于指定key 生成器,非必需。
若需要指定一个自定义的key生成器,我们需要去实现 org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定

cacheManager用于指定使用哪个缓存管理器,非必需。只有当有多个缓存管理器时才需要使用。

cacheResolver用于指定使用那个缓存解析器,非必需。需通过 org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。

3、@CachePut

用于更新缓存,无论结果是否已经缓存,都会在方法执行结束插入缓存,相当于更新缓存,一般用于更新方法新增方法之上。其参数与@Cacheable类似。

4、@CacheEvict

配置于方法上,通常用在删除方法上,用来从缓存中移除相应数据。 除了同@Cacheable一样的参数之外,它还有下面两个参数:
allEntries,非必需,默认为false。当为true时,会移除对应缓存对象的所有缓存数据,也就是移除cacheNamevalue指定的对象的缓存数据。
beforeInvocation,非必需, 默认为false,会在调用方法之后移除数据。 当为 true时,会在调用方法之前移除数据。

5、总结

一般来说,我们都在Service实现层的类上面使用@CacheConfig来指定公共缓存配置,在查询的方法上使用@Cacheable,在新增/修改的方法上使用@CachePut,在删除的方法上使用@CacheEvict

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章