spring boot2.0之自定义 RedisCacheManager 的方法

今天在学习spring boot框架的路上遇到了Redis和缓存机制的整合,在试图创建一个 RedisCacheManager 缓存管理器时,遇到了很多问题,接下来和大家分享一下我解决问题的心(xin)路(suan)历程。

一、springboot1.0和2.0的默认创建的 RedisCacheManager 方法是不同的

springboot1.0RedisCacheManager

 //缓存管理器
    @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里面存在缓存数据,立刻清空再运行,解决问题。

 spring boot2.0之自定义 RedisCacheManager 的方法_第1张图片

 

你可能感兴趣的:(问题解决)