spring 缓存
org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口是 spring 中用来统一不同的缓存技术公用接口
Cache 接口为缓存的组件规范定义,包含缓存的各种操作集合
Cache 接口下 spring 提供了各种 xxxCache 的实现,如 RedisCache、ConcurrentMapCache 等
每次调用有缓存功能的方法时,spring 会检查指定参数的目标方法是否已经被调用过,如果有就直接从缓存中获取方法的结果;如果没有就调用过方法就先缓存结果后在将结果返回给用户,下次调用直接从缓存中获取。
使用 spring 缓存抽象时我们需要关注以下两点:
确定方法需要被缓存以及他们的缓存策略
从缓存中读取之前缓存存储的数据
spring 缓存中几个概念
名词
说明
Cache
缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache 等
CacheManager
缓存管理器,管理各种缓存 (Cache) 组件
@Cacheable
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CacheEvict
清空缓存的注解
@CachePut
保证方法被调用,又希望结果被缓存
@EnableCaching
开启基于注解的缓存
keyGenerator
缓存数据时 key 生成策略
serialize
缓存数据时 value 序列化策略
@Cacheable、@CacheEvict 和 @CachePut 注解属性
属性
说明
示例
value
缓存的名称,在 spring 配置文件中定义,必须指定 至少一个
@Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}
key
缓存的 key,可以为空,如果指定要必须按照 spel 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
@Cacheable(value=”testcache”,key=”#userName”)
condition
缓存的条件,可以为空,使用 spel 编写,返回 true 或者 false,只有为 true 才进行缓存 / 清除缓存,在调用方法之前之后都能判断
@Cacheable(value=”testcache”,condition=”#userNam e.length()>2”)
allEntries (@CacheEvict)
是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation(@CacheEvict)
是否在方法执行前就清空,缺省为 false,如果指定 为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空 缓存
@CachEvict(value=”testcache”,beforeInvocation=true)
unless(@CachePut) (@Cacheable)
用于否决缓存的,不像 condition,该表达式只在方 法执行之后判断,此时可以拿到返回值 result 进行判 断。条件为 true 不会缓存,fasle 才缓存
@Cacheable(value=”testcache”,unless=”#result == null”)