Spring 从 3.1 开始就引入了对 Cache 的支持(Spring Cache),定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术(如:Redis、EhCache等)。
Spring Cache 支持使用 JCache(JSR-107)注解简化我们的开发。
JSR 是 Java Specification Requests 的缩写,意思是 Java 规范提案。2012年10月26日 JSR 规范委员会发布了 JSR 107(JCache API 的首个早期草案)。JCache 规范定义了一种对 Java 对象临时在内存中进行缓存的方法,包括对象的创建、共享访问、假脱机(spooling)、失效、各 JVM 的一致性等,可被用于缓存 JSP 内最经常读取的数据。
Java Caching 定义了 5 个核心接口,分别是 CachingProvider、CacheManager、Cache、Entry 和 Expiry。其中:
CachingProvider:缓存提供者,定义了创建、配置、获取、管理和控制多个 CacheManager。一个应用可以在运行期访问多个 CachingProvider。
CacheManager:缓存管理器,定义了创建、配置、获取、管理和控制多个唯一命名的 Cache,这些 Cache 存在于 CacheManager 的上下文中,一个 CacheManager 仅被一个 CachingProvider 所拥有。
Cache:缓存组件,是一个类似 Map 的数据结构并临时存储以 key 为索引的值。一个 Cache 仅被一个 CacheManager 所拥有。
Entry:键值对,是一个存储在 Cache 中的 key-value 对。
Expiry:有效期。每一个存储在 Cache 中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过 ExpiryPolicy 设置。
Spring Cache 的使用方法和原理都类似于 Spring 对事务管理的支持。
Spring Cache 是作用在方法上的,其核心思想是:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中,再次调用时,根据参数直接从缓存中获取(前提是缓存可用,没有过期)。
Spring Cache 核心接口之间的关系如下图: