最近在学习SpringBoot整合Redis,学到自定义RedisCacheManager的时候,我发现网上的博客大部分都是SpringBoot 1.X版本的,但是我学的是SpringBoot 2.X。很多类已经发生了变化,不能再用了,于是决定去官网找找看。
终于我在Spring 官方文档的:5.14.1. Support for the Spring Cache Abstraction这个章节找到了相关内容
下面简单的描述一下:
要使用的Redis的定制功能,请将RedisCacheManager添加到配置中,如下所示:
//这里的方法名就是Bean的id,对应签名cacheManager要填的内容
@Bean
public RedisCacheManager myCacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.create(connectionFactory);
}
这样一个最简单的自定义cacheManager就实现了,它什么都没做
那么如果想要更加详细的定义它的行为的话,我们可以使用 RedisCacheManagerBuilder,如下:
@Bean
public RedisCacheManager myCacheManager2(RedisConnectionFactory connectionFactory) {
//获取RedisCacheManagerBuilder
RedisCacheManager cm = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaultCacheConfig())
.withInitialCacheConfigurations(singletonMap("predefined",defaultCacheConfig().disableCachingNullValues()))
.transactionAware()
.build();
return cm;
}
如前一个示例所示,RedisCacheManager允许根据每个缓存定义配置.
使用RedisCacheManager创建的RedisCache的行为由RedisCacheConfiguration定义.该配置允许我们设置密钥过期时间、前缀和序列化实现方式(替换为JSON方式等),如下例所示:
@Bean
public RedisCacheManager myCacheManager3(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(15)) // 设置缓存过期时间
.disableCachingNullValues() // 禁用缓存空值,不缓存null校验
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericJackson2JsonRedisSerializer())); // 设置CacheManager的值序列化方式为json序列化,可加入@Class属性
// 使用RedisCacheConfiguration创建RedisCacheManager
RedisCacheManager cm = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(cacheConfiguration ).build();
return cm;
}
除了这些以为,我们还可以定义它的锁的行为:
RedisCacheManager cm = RedisCacheManager.build(RedisCacheWriter.lockingRedisCacheWriter())
.cacheDefaults(defaultCacheConfig())
.........
以及设定key的前缀:
// static key prefix
RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith("( ͡° ᴥ ͡°)");
The following example shows how to set a computed prefix:
// computed key prefix
RedisCacheConfiguration.defaultCacheConfig().computePrefixWith(cacheName -> "¯\_(ツ)_/¯" + cacheName);
值得注意的是如果我们定义了两个以上的CacheManager的时候Spring Boot启动就突然报错了:
错误的大致意思是Spring无法得知它在默认的时候要使用哪个CacheManager,需要我们指定一个默认的CacheManager给它,这时候我们需要创建一个基本的CacheManager或者在原来的CacheManager上指定一个加上@Primary注解:
@Bean
@Primary//加上这个注解就可以了
public RedisCacheManager myCacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.create(connectionFactory);
}
其他具体情况,请参考官方文档