JSR-107缓存规范和Spring缓存抽象,注解介绍
一、JSR-107是缓存规范
1.CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
2.CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
3.Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
4.Entry是一个存储在Cache中的key-value对。
5.Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置
二、.Spring缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManger接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;
几个重要概念和缓存注解
|
|
Cache |
缓存接口,定义缓存操作。实现有:RedisCache、EnCacheCache、ConcurrentMapCache |
CacheManager |
缓存管理器,管理各种缓存组件(Cache) |
@Cacheable |
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 |
@CacheEvict |
清空缓存 |
@CachePut |
保证方法被调用,又希望结果被缓存 |
@EnableCaching |
开启基于注解的缓存 |
keyGenerator |
缓存数据时key生成策略 |
serialize |
缓存数据时value序列化策略 |
1.Cache:缓存接口,定义缓存操作。实现:RedisCache、EhCacheCache等
2.CacheManager:缓存管理器,管理各种缓存(Cache)组件
[email protected]:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
可以设置的属性
KeyGenerator可以自己去实现一个,
参数可以设置的值
例如:
@Cacheable(cacheNames = "emp", key="#root.args[0]",condition = "#a0>1",unless = "#a0==2")
public Employee getEmployee(Integer id){
System.out.println("查询"+id);
Employee employee=employeeMapper.getEmployee(id);
return employee;
}
表示缓存的名字叫emp,key值为第一个参数(依旧是id),值缓存第一个参数大于1的(id>1),第一个参数等于2的不缓存(id=2)。
[email protected]:清空缓存,在删除方法中加入注解,删除数据后同时删除缓存
allEntries = true 表示清楚这个缓存中所有数据
Key="#id" 指定清楚id缓存
beforeInvocation = true 代表清楚缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除。
@CacheEvict(value = "emp",allEntries = true)
[email protected]:保证方法被调用,又希望结果被缓存。
要想更新后在标准@Cacheable的方法查询数据时直接访问缓存,必须保证value/cacheNames与key相同,如
@Cacheable(cacheNames = "emp", key="#root.args[0]")
@CachePut(cacheNames = "emp",key = "#result.id")
[email protected]:开启基于注解的缓存
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "#lastName")
},
put = {
@CachePut(value = "emp",key = "#result.id"),
@CachePut(value = "emp",key = "#result.email")
}
)