缓存
Spring 对缓存的支持有两种方式:
- 注解驱动的缓存
- XML 声明的缓存
用 XML 的话,可以使用 Spring cache 命名空间中的 <cache:annotation-driven> 元素来启动注解驱动的缓存。
注解的话可以使用: @EnableCaching 与 XML 的工作方式相同。
它们都会创建一个切面(aspect),并触发 Spring 缓存注解的切点(pointcut)。这个切面会从缓存中获取数据,将数据添加到缓存之中或者从缓存中移除某个值。
@EnableCaching
//启用了注解驱动的缓存,声明了缓存管理器(cache manager)的 bean。
//缓存管理器是 Spring 缓存抽象的和核心,能够与多个流行的缓存实现进行集成。
@Configuration
@EnableCaching //启用缓存
public class CachingConfig {
@Bean
public CacheManager cacheManager() {
//声明缓存管理器
return new ConcurrentMapCacheManager();
}
}
使用 Ehcache 缓存
EnCacheCacheManager 缓存管理器
@Configuration
@EnableCaching//启用缓存
public class CachingConfig {
//配置EhCacheCacheManager缓存管理器
@Bean
public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
return new EhCacheCacheManager(cacheManager);
}
}
Redis 缓存
用来为 Spring 缓存抽象机制存储条目,Spring Data Redis 提供了RedisConnectionFactory 实现类的一个 bean。
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
CacheManager cacheManager = new RedisCacheManager(redisTemplate);
return cacheManager;
/*RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
// 多个缓存的名称,目前只定义了一个
rcm.setCacheNames(Arrays.asList("thisredis"));
//设置缓存默认过期时间(秒)
rcm.setDefaultExpiration(600);
return rcm;*/
}
// 以下两种redisTemplate自由根据场景选择
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(factory);
return stringRedisTemplate;
}
}
- @EnableCaching:开启缓存
- @Cacheable:表明 Spring 在调用方法之前。在缓存中查找方法的返回值,若找的到就返回缓存的值。否则,就调用,返回值放在缓存中。
- @CachePut:方法被调用,返回值放入缓存。
- @CacheEvict:清除缓存。
- @Caching:缓存接口。(RedisCache、EhCacheCache、ConcurrentMapCache)
- @CacheConfig:抽取缓存公共配置,可以标注在类上。
@Cacheable 和 @CachePut 都可以填充缓存。