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是一个 类型级别的注解,可以配置共享的缓存名称,

也可以配置自定义的KeyGeneratorCacheManagerCacheResolver`。

注解在 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 将不会被包装在缓存代理中,这将是非常糟糕的。

文档

没有什么能比官方文档更适于学习的:

官方文档

官方文档-中文翻译

我的博客:https://www.seyana.life/post/13

posted @ 2020-03-06 15:33  opticor  阅读(128)  评论(0编辑  收藏  举报