SpringBoot 2.X版本自定义CacheManager

最近在学习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);
}

其他具体情况,请参考官方文档

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值