我们接下来就自定义将数据保存为json格式
我们先来看源码CacheAutoConfiguration里面的@EnableConfigurationProperties(CacheProperties.class)(将所有的属性都绑定到这里面),我们的CacheAutoConfiguration源码还有如下的配置可以导入CacheConfigurations缓存的自动配置类
/**
* {@link ImportSelector} to add {@link CacheType} configuration classes.
*/
static class CacheConfigurationImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
CacheType[] types = CacheType.values();
String[] imports = new String[types.length];
for (int i = 0; i < types.length; i++) {
imports[i] = CacheConfigurations.getConfigurationClass(types[i]);
}
return imports;
}
}
CacheConfigurations源码里面我们就可以导入redis相关的自动配置类RedisCacheConfiguration
mappings.put(CacheType.REDIS, RedisCacheConfiguration.class);
总结:CacheAutoConfiguration帮我们导入了org.springframework.boot.autoconfigure.cache;RedisCacheConfiguration源代码如下
class RedisCacheConfiguration {
@Bean
RedisCacheManager 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));
}
redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return cacheManagerCustomizers.customize(builder.build());
}
我们继续查看上面源代码中,如下代码的源代码RedisCacheConfiguration
ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,
org.springframework.data.redis.cache.RedisCacheConfiguration源代码就可以进行序列化,反序列化配置
public class RedisCacheConfiguration {
private final Duration ttl;
private final boolean cacheNullValues;
private final CacheKeyPrefix keyPrefix;
private final boolean usePrefix;
private final SerializationPair<String> keySerializationPair;
private final SerializationPair<Object> valueSerializationPair;
private final ConversionService conversionService;
org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration有一行代码,帮我们实现了默认配置如下

mall-product
config
@Configuration
@EnableCaching
public class MyCacheConfig {
//缓存的序列方式自定义设置
@Bean
RedisCacheConfiguration redisCacheConfiguration(){
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
config=config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return config;
}
}


修改后代码如下
@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class MyCacheConfig {
/**
*
* Configuration properties for the cache abstraction.
*1:原来和配置文件绑定的配置类是这样子的
@ConfigurationProperties(prefix = "spring.cache")
*public class CacheProperties {
* 2:要让它生效
*@EnableConfigurationProperties(CacheProperties.class)
* 问题:配置文件中的ttl没有用上
* @return
*/
//缓存的序列方式自定义设置
@Bean
RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
config=config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
CacheProperties.Redis redisProperties = cacheProperties.getRedis();
//将配置文件中的所有东西都要拿来
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;
}
}

#缓存类型
spring:
cache:
type: redis
redis:
time-to-live: 3600000
#如果指定了前缀,我们就用指定的前缀,如果没有就默认使用缓存的注解里面设置的 @Cacheable(value={"category"},key = "#root.method.name")
key-prefix: CACHE_
use-key-prefix: true
# 是否缓存空值,防止缓存穿透
cache-null-value: true

版权声明:本文为qq_44891295原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。