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设置

JSR-107缓存规范和Spring缓存抽象,注解介绍

 

 

二、.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]:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

可以设置的属性

JSR-107缓存规范和Spring缓存抽象,注解介绍

KeyGenerator可以自己去实现一个,

JSR-107缓存规范和Spring缓存抽象,注解介绍

JSR-107缓存规范和Spring缓存抽象,注解介绍

参数可以设置的值

JSR-107缓存规范和Spring缓存抽象,注解介绍

例如:

@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/cacheNameskey相同,如

@Cacheable(cacheNames = "emp", key="#root.args[0]")

@CachePut(cacheNames = "emp",key = "#result.id")

 

JSR-107缓存规范和Spring缓存抽象,注解介绍

 

[email protected]:开启基于注解的缓存

@Caching(
        cacheable = {
            @Cacheable(value = "emp",key = "#lastName")
        },
        put = {
            @CachePut(value = "emp",key = "#result.id"),
            @CachePut(value = "emp",key = "#result.email")
        }
)

7.CacheConfig:在类上加这个注解表示整个类都生效,

如:@CacheConfig(cacheNames ="emp" )那在该类中所有的注解不需要在声明cacheNames ="emp"

8.KeyGenerator:缓存数据时key生成策略

9.serialize:缓存数据时value***策略