Spring cache 学习随笔
相关
Spring框架支持透明地向应用程序添加缓存。从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。缓存逻辑应用透明,不会对调用者造成任何干扰。
可以极大的提高页面响应的速度。
cache 注解
spring cache 提供了一组注解:
注解 | 功能 |
---|---|
@CacheConfig | 设置类级别上统一的一些常见缓存设置 |
@Cacheable | 缓存写入和读取 |
@CacheEvict | 缓存清除 |
@CachePut | 更新缓存 |
@Caching | 将多种缓存操作分组 |
通用的注解属性
value/cacheNames
二者差不多,
缓存名,根据此创建cache,再cache下分key-value存储,
可以指定多个缓存名,只要有一个缓存被命中,就会返回关联的value,更新同理
key
缓存对象的唯一标识
在默认情况下:
- If no params are given, return
SimpleKey.EMPTY
. - If only one param is given, return that instance.
- If more the one param is given, return a
SimpleKey
that contains all parameters.
keyGenerator
用于自定义的key值生成器,
对应类KeyGenerator
cacheManager
指定缓存管理器
cacheResolver
定义如何访问缓存列表
condition
缓存条件,可以使用SpEL表达式指定存放缓存的条件
unless
于前者相反,指定不更新缓存的条件
@Cacheable
一般可以用在读取,查询类的操作上
- 如果对应的缓存不存在,将结果写入缓存
- 如果对应的缓存存在,直接读取返回
对于多线程,sync
属性可用于指示底层缓存提供程序在计算 value 时锁定缓存条目。因此,只有一个线程忙于计算 value,而其他线程将被阻塞,直到缓存中的条目更新为止
@Cacheable(value = CACHE_NAME,key = "#root.method")
public List<info> getAll() {}
@CachePut
必定在执行后更新缓存,不会干扰到方法执行,一般可以用在增加添加一类的操作上
@CacheEvict
清空指定的缓存,多了两个属性
- allEntries 是否清空所有缓存,默认为 false。
- **beforeInvocation **是否在方法执行前就清空,默认为 false
可以在更改等操作后清除原先的缓存
@CacheEvict(value = {LIBRARY_CACHE_NAME, BOOK_CACHE_NAME}, allEntries = true, beforeInvocation = true)
public book update(Integer id, String name) {}
@CacheConfig
@CacheConfig
是一个 类型级别的注解,可以配置共享的缓存名称,
也可以配置自定义的KeyGenerator,
CacheManager,
CacheResolver`。
注解在 class 上不会打开任何缓存操作。
在方法上的配置将始终覆盖@CacheConfig
上的配置。
@Caching
有些情况需要指定相同类型的多个注释,例如@CacheEvict
或@CachePut
,因为不同缓存之间的条件或 key 表达式不同,@Caching
允许在同一方法上使用多个嵌套的@Cacheable
,@CachePut
和@CacheEvict
。
@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)
另外
官方文档建议只将cache注解使用在具有公共可见性的方法上,注释 protected,private 或 package-visible 方法,则不会引发错误,但带注释的方法不会显示已配置的缓存设置。
还建议只将cache注解使用在类上,而不是接口上:
Java annotations 不是从接口继承的事实意味着如果您使用 class-based 代理(proxy-target-class="true"
)或 weaving-based aspect(mode="aspectj"
) ,则代理和编织基础结构无法识别缓存设置,并且 object 将不会被包装在缓存代理中,这将是非常糟糕的。
文档
没有什么能比官方文档更适于学习的: