?1.Redis 注解默認序列化機制
1.Spring Boot整合Redis組件提供的緩存自動配置類RedisCacheConfiguration(org.springframework.boot.autoconfigure.cache),
其內部是通過Redis連接工廠RedisConnectionFactory定義了一個緩存管理器RedisCacheManager;
同時定義RedisCacheManager時,也默認使用了JdkSerializationRedisSerializer序列化方式。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisConnectionFactory.class)
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class RedisCacheConfiguration {@BeanRedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));List<String> cacheNames = cacheProperties.getCacheNames();if (!cacheNames.isEmpty()) {builder.initialCacheNames(new LinkedHashSet<>(cacheNames));}if (cacheProperties.getRedis().isEnableStatistics()) {builder.enableStatistics();}redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));return cacheManagerCustomizers.customize(builder.build());}private org.springframework.data.redis.cache.RedisCacheConfiguration determineConfiguration(CacheProperties cacheProperties,ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,ClassLoader classLoader) {return redisCacheConfiguration.getIfAvailable(() -> createConfiguration(cacheProperties, classLoader));}private org.springframework.data.redis.cache.RedisCacheConfiguration createConfiguration(CacheProperties cacheProperties, ClassLoader classLoader) {Redis redisProperties = cacheProperties.getRedis();org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();config = config.serializeValuesWith(SerializationPair.fromSerializer(new JdkSerializationRedisSerializer(classLoader)));if (redisProperties.getTimeToLive() != null) {config = config.entryTtl(redisProperties.getTimeToLive());}if (redisProperties.getKeyPrefix() != null) {config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());}if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}}
??????2.如果想要使用自定義序列化方式的RedisCacheManager進行數據緩存操作,可以創建一個名為cacheManager的Bean組件,并在該組件中設置對應的序列化方式即可
2.自定義RedisCacheManager
@Bean
public?RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {// 分別創建String和JSON格式序列化對象,對緩存數據key和value進行轉換RedisSerializer<String>strSerializer?= new?StringRedisSerializer();Jackson2JsonRedisSerializer jacksonSeial?= new?Jackson2JsonRedisSerializer(Object.class);// 解決查詢緩存轉換異常的問題ObjectMapper om?= new?ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//過時om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);//用下面的方法代替上面的方法
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);jacksonSeial.setObjectMapper(om);// 定制緩存數據序列化方式及時效RedisCacheConfiguration config?= RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial)).disableCachingNullValues();RedisCacheManager cacheManager?= RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();return cacheManager;
}
3.效果測試
項目啟動成功后,通過瀏覽器訪問http://localhost:8088/get/3,并重復刷新瀏覽器查看同一條數據信息 ,數據庫只執行了一次SQL語句
緩存結果如下: