今天在学习spring boot框架的路上遇到了Redis和缓存机制的整合,在试图创建一个 RedisCacheManager 缓存管理器时,遇到了很多问题,接下来和大家分享一下我解决问题的心(xin)路(suan)历程。
一、springboot1.0和2.0的默认创建的 RedisCacheManager 方法是不同的
springboot1.0:RedisCacheManager
//缓存管理器
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//设置缓存过期时间
cacheManager.setDefaultExpiration(10000);
return cacheManager;
} //缓存管理器
1.0是使用 RedisTemplate 来操作redis,但是在2.0版本已经不再采用这个RedisTemplate了,从下面2.0得源码即可看出
springboot2.0:RedisCacheManager
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory,
ResourceLoader resourceLoader) {
RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(determineConfiguration(resourceLoader.getClassLoader()));
List cacheNames = this.cacheProperties.getCacheNames();
if (!cacheNames.isEmpty()) {
builder.initialCacheNames(new LinkedHashSet<>(cacheNames));
}
return this.customizerInvoker.customize(builder.build());
}
从上面两段代码就很清楚的可以看出两个版本之间RedisCacheManager的不同
二、springboot2.0自定义RedisCacheManager
@Bean
public RedisCacheManager employeeRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1)) // 设置缓存过期时间为一天
.disableCachingNullValues() // 禁用缓存空值,不缓存null校验
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericJackson2JsonRedisSerializer())); // 设置CacheManager的值序列化方式为json序列化,可加入@Class属性
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build(); // 设置默认的cache组件
}
然后经过长达50分钟的百度以及结合源码的理解,得出上面的RedisCacheManager的写法,这是一个比较简单的方法,但是为了理解它的每个方法,所以花的时间比较长,所以觉得要写篇博客来记录一下,另外再写下使用这个缓存管理器的时候遇到的问题。
三、运行RedisCacheManager控制台报错
2019-07-08 15:40:01.725 ERROR 3672 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unexpected character ('¬' (code 172)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
这个错误的出现让我猝不及防,因为控制台还有打印出乱码,一开始以为是缓存中存在中文会导致乱码问题,但是修改了缓存的数据之后没有用,最后百度出了一篇大佬的文章,他的一句话让我瞬间解决问题。
然后我马上跑去看我的Redis Desktop Manager,果真,我的redis里面存在缓存数据,立刻清空再运行,解决问题。