Spring框架提供了便捷的缓存操作。不会对业务调用造成任何干扰,类似于
@Transactional
支持。不需要手动存取,删除缓存,只需要在类或者方法上进行少量的注解就可以自动完成这些操作。
一.核心概念
1.引入缓存
-
spring-boot中引入缓存
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> </dependencies>
2.基本概念
- Spring缓存框架中最关键的2个顶级类为
org.springframework.cache.CacheManager
和org.springframework.cache.Cache
;前者为缓存管理器,管理所有缓存实现,后者定义了缓存的存储规则 - 我们查看一下实现类结构,可见默认实现了一系列的缓存
- SpringCache支持如下类型缓存管理,当引入各自的spring-starter包就可以使用,SpringCache会依次扫描如下管理器,来加载可用缓存:
Generic
,JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
,EhCache 2.x
,Hazelcast
,Infinispan
,Couchbase
,Redis
,Caffeine
,Simple
二.默认实现
1.SpringBoot缺省状态下的默认实现
-
SpringCache默认使用内存实现缓存,我们需要关注的是缓存中key的实现规则,和数据存储在哪里。
-
在程序启动时可以看到Spring加载关于cache的类,
CacheAutoConfiguration
,SimpleCacheConfiguration
他们定义了spring加载cache的所有流程。 -
其中最关键的三个类是SimpleKeyGenerator(缓存存储时key的生成规则),ConcurrentMapCacheManager(缓存管理器),ConcurrentMapCache(缓存的存储库)
-
SimpleKeyGenerator类
-
根据CacheAutoConfiguration类引入的CacheAspectSupport类中可以找到springCache加载key的规则
private SingletonSupplier<KeyGenerator> keyGenerator = SingletonSupplier.of(SimpleKeyGenerator::new);
-
SimpleKeyGenerator类中关于key的实现
public static Object generateKey(Object... params) { if (params.length == 0) { return SimpleKey.EMPTY; } else { if (params.length == 1) { Object param = params[0]; if (param != null && !param.getClass().isArray()) { return param; } } return new SimpleKey(params); }
-