Spring CacheManager

Spring 中提供了很多存储器,例如: SimpleCacheManager , EhCacheCacheManager, GuavaCacheManager, CompositeCacheManger。处理核心的Spring框架之外,Spring Date 提供提供了Redis缓存管理器。RedisCacheManager。

Spring Boot 中通过 @EnableCaching 注解自动化配置合适的缓存管理器。
默认情况下Spring Boot 根据以下顺序自动检测缓存提供者:

  • Generic
  • JCache (JSR-107)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Redis
  • Guava
  • Simple

若我们手动配置RedisTemplate后,Spring Boot 就无法自动给RedisCacheManager设置redisTemplate,所以需要自己配置RedisCacheManager。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
RedisConfig.java

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.afterPropertiesSet();
setSerializer(redisTemplate);
return redisTemplate;
}

private void setSerializer(RedisTemplate<String, String> template) {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(jackson2JsonRedisSerializer);
}

@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
// 设置缓存过期时间,秒
rcm.setDefaultExpiration(60);
return rcm;
}
}

Spring 提供了以下注解来声明缓存规则

@Cacheable triggers cache population 表明Spring在调用方法之前,首先应该在缓存中查找方法的返回值,,如果这个值能够找到,就会返回这个值。否则的话,这个方法就会被调用,返回值会放到缓存中
@CacheEvict triggers cache eviction 表明Spring应该在缓存中清除一个或多个条目
@CachePut updates the cache without interfering 表明Spring应该将方法的返回值放到缓存中,在方法的调用前并不会检查,方法始终都会被调用
@Caching regroups multiple cache operations to be applied on a method
@CacheConfig shares some common cache-related setting at class-level 可以在类层级配置一些公用的缓存配置

@Cacheable 和 @CachePut 共有属性:

属性 类型 描述
value String[] 要使用的缓存名称
condition String SpEL 表达式,如果得到的值是false的话,不会将缓存应用到方法调用上
key String SpEL表达式,用来计算自定义的缓存key
unless String SpEL表达式,如果得到的值是true的话,返回值不会放到缓存之中

使用 CacheManager 的有点:
CacheManager 是所有缓存管理器的父级,定义了一些通用接口。
具体的缓存实现可以继承CacheManger,并自行实现功能。通过这个方法可以进行拆分解耦,当替换其他缓存插件时,不需要修改代码,只需要修改配置文件就行。

Redis 在项目中的使用

  1. 开启Redis事务 @TransactionalstringRedisTemplate.setEnableTransactionSupport(true); 需要同时启用。
  2. 查询不存在的数据,需要将一组空数据写入Redis,防止数据库被穿透。
  3. 查询数据时,需要使用 lock ,来防止所有请求都走数据库,而不走Redis,大流量,大并发的情况下。

Redis 集群

Redis 集群只有 db0,不支持 select db操作,不支持 Redis 事务操作。