1. 程式人生 > >springCache配置中踩的坑

springCache配置中踩的坑

專案基於SpringBoot,使用了SpringCache。
早先在網上找了一份SpringCache的配置,後來由於需要使用到自定義序列化方法,注入一個自定義的序列化類。但是在後來發現自定義的序列化類始終沒有呼叫,後來檢視原始碼後終於發現了原因

先附上正確的配置

  @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory, SessionSerializer serializer) {
        logger.debug("生成快取管理器");

        logger.
debug("注入的序列化工具={}", serializer); RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair.fromSerializer(serializer); logger.debug("生成的cache序列化工具={}", pair); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
// 生成一個預設配置,通過config物件即可對快取進行自定義配置 config = config.entryTtl(Duration.ofMinutes(10)) // 設定快取的預設過期時間,也是使用Duration設定 .serializeValuesWith(pair) // .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .
disableCachingNullValues() ; // 不快取空值 logger.debug("初始化完成的config={}", config); // 設定一個初始化的快取空間set集合 Set<String> cacheNames = new HashSet<>(); cacheNames.add(CACHE_NAME); return RedisCacheManager.builder(new CusTtlRedisCacheWriter(factory)) // 使用自定義的快取配置初始化一個cacheManager .cacheDefaults(config)//這一句必須要最先執行,否則實際執行時使用的是defaultConfig .initialCacheNames(cacheNames) // .withInitialCacheConfigurations(configMap) // .transactionAware() .build(); }

重要在於最後一行return的時候,早先的找到的資料說initialCacheNames方法一定要先執行,否則就會巴拉巴拉~~~,,結果就掉坑了

如果initialCacheNames方法先執行的話,實際上CacheManager裡使用的是DefaultConfig,裡面的序列化方式也就是Jdk序列化,後面在呼叫cacheDefaults也沒有用了。

所有,cacheDetaults方法一定要先執行