1、缓存规范 JSR107及核心接口类
java caching定义了5个核心接口,分别是CachingProvider,CacheManager,Cach,Entry,Expiry。
-
CachingProvider:定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
-
CacheManager:定义了创建,配置,获取,管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CacheProvider所拥有。
-
Cache:是一个类似Map的数据结构并临时存储以key为索引的值。一个Cache仅被一个CacheManager所拥有。
-
Entry:是一个存储在Cache中的key-value对。
-
Expiry:每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新、删除。缓存有效期可以通过ExpiryPolicy设置。
以上几个核心接口的关系图解:
2、缓存概念及注解
概念或注解 | 定义 | |
---|---|---|
Cache | 缓存接口,定义缓存操作。实现有:RedisCache、EnCacheCache、ConcurrentMapCache等。 | |
CacheManager | 缓存管理器,管理各种缓存(Cache)组件 | |
@Cacheable | 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 | |
@CacheEvict | 清空缓存 | |
@CachePut | 保证方法被调用,又希望结果被缓存 | |
@EnableCaching | 开启基于注解的缓存 | |
keyGenerator | 缓存数据时key生成策略 | |
serialize | 缓存数据时value序列化策略 |
3、@Cacaheable/@CachePut/@CacheEvict主要的参数
value | 缓存的名称,在spirng配置文件中定义,必须制定至少一个 | 例如:<br />@Cacheable(value="emp")或者@Cacheable(value={"dept","emp"}) |
---|---|---|
key | 缓存的key,可以为空,如果指定要按照spel表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。 | 例如:<br />@Cacheable(value="emp",key="#userName") |
condition | 缓存的条件 | 例如:<br />@Cacheable(value="emp",conditon="#userName.length()>2") |
allEntries(@CacheEvict) | 是否清空所有缓存内容,默认是false. | 例如:<br />@Cacheable(value="emp",allEntries=true) |
beforeInvocation(@CacheEvict) | 是否在方法执行前就清空,默认是false,如果指定为true,则在方法还没有执行的时候就清空缓存。 | 例如:<br />@Cacheable(value="emp",beforeInvocation=true) |
unless(@Cacaheable,@CachePut) | 用于否决缓存的,不像condition,该表达式只在方法执行之后判断,此时可以拿到的返回值result进行判断。条件为true不会缓存,false才缓存。 | 例如:<br />@Cacheable(value="emp",unless="#result==null") |