Update RedisCacheConfig.java

cyj
pbvfus8to 8 months ago
parent ca1bca2152
commit a9f95e2bc9

@ -8,50 +8,174 @@
*
*/
// 该类所属的包名表明其位于商城项目的通用common配置config包下主要用于对Redis缓存相关的配置进行定义和设置通过Spring的配置类机制
// 在满足一定条件配置文件中spring.cache.type = redis时生效来实现Redis缓存在项目中的集成与定制化配置。
package com.yami.shop.common.config;
import com.yami.shop.common.bean.AliDaYu;
import com.yami.shop.common.bean.ImgUpload;
import com.yami.shop.common.bean.Qiniu;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
/**
* 便使
* 使 Spring @Component@ConfigurationProperties@PropertySource
* 使便 token 使
* RedisCacheConfigSpringRedis使Redis
* spring.cache.type = redisRedis
*
* @author lgh
*/
@Data
@Component
@PropertySource("classpath:shop.properties")
@ConfigurationProperties(prefix = "shop")
public class ShopBasicConfig {
@EnableCaching
// 使用@EnableCaching注解开启Spring的缓存功能使得在项目中可以使用诸如@Cacheable、@CachePut、@CacheEvict等缓存相关的注解来方便地操作缓存提高应用性能。
@Configuration
// 使用@Configuration注解表明该类是一个配置类Spring会扫描这个类并根据其中定义的@Bean方法来创建相应的Bean实例注入到Spring容器中供其他组件使用。
public class RedisCacheConfig {
/**
* CacheManagerBeanCacheManagerSpringRedis
* RedisConnectionFactoryRedisRedisSerializer
* RedisCacheManagerRedis
*
* @param redisConnectionFactory RedisRedisRedis
* @param redisSerializer JavaRedis
* @return RedisCacheManagerRedisSpring便使
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, RedisSerializer<Object> redisSerializer) {
RedisCacheManager redisCacheManager = new RedisCacheManager(
RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
// 默认策略,未配置的 key 会使用这个
this.getRedisCacheConfigurationWithTtl(3600, redisSerializer),
// 指定 key 策略
this.getRedisCacheConfigurationMap(redisSerializer)
);
redisCacheManager.setTransactionAware(true);
return redisCacheManager;
}
/**
* RedisMapHashMap"product"Redis
* 使便
*
* @param redisSerializer
* @return RedisMapRedisCacheManager便
*/
private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap(RedisSerializer<Object> redisSerializer) {
Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>(16);
redisCacheConfigurationMap.put("product", this.getRedisCacheConfigurationWithTtl(1800, redisSerializer));
return redisCacheConfigurationMap;
}
/**
* 访
* 便便
* TTLTime To LiveRedisRedisRedisCacheConfiguration.defaultCacheConfig()
* 使redisSerializerDuration.ofSeconds(seconds)Redis
*
* @param seconds Redis
* @param redisSerializer 便RedisRedis
* @return RedisRedisCacheManager使
*/
private Qiniu qiniu;
private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds, RedisSerializer<Object> redisSerializer) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
RedisSerializationContext
.SerializationPair
.fromSerializer(redisSerializer)
).entryTtl(Duration.ofSeconds(seconds));
return redisCacheConfiguration;
}
/**
*
* 访 ID访
* RedisTemplateBeanRedisTemplateSpring Data RedisRedis
* Redis
* 使便使Redis
*
* @param redisConnectionFactory RedisRedisTemplateRedisRedis访Redis
* @param redisSerializer RedisTemplateRedisRedis
* @return RedisTemplateSpring便使Redis
*/
private AliDaYu aLiDaYu;
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer<Object> redisSerializer) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(redisSerializer);
redisTemplate.setHashValueSerializer(redisSerializer);
redisTemplate.setEnableTransactionSupport(false);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* RedisBeanObjectMapperJackson
* Spring MVCObjectMapperRedis
* ObjectMapperGenericJackson2JsonRedisSerializerRedis
*
* @return GenericJackson2JsonRedisSerializerRedisSpringRedisRedisCacheManagerRedisTemplate使
*
*/
/**
* token token
* token 使使
* redis,ObjectMapper.MVC
* https://juejin.im/post/5e869d426fb9a03c6148c97e
*/
private String tokenAesKey;
@Bean
public RedisSerializer<Object> redisSerializer() {
ObjectMapper objectMapper = JsonMapper.builder().disable(MapperFeature.USE_ANNOTATIONS).build();
// 反序列化时候遇到不匹配的属性并不抛出异常,这样即使缓存数据中存在一些在当前类中没有定义的属性,也能正常进行反序列化操作,提高了兼容性和容错性。
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 序列化时候遇到空对象不抛出异常,避免因为缓存数据中存在空对象而导致序列化失败的情况,使得空对象也能按照预期进行序列化处理。
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 反序列化的时候如果是无效子类型,不抛出异常,在处理复杂的继承结构或者类型变化时,即使遇到不符合预期的子类型情况,也能继续进行反序列化,增强了反序列化的稳定性。
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
// 不使用默认的dateTime进行序列化避免在处理日期时间类型数据时出现格式不符合项目需求的情况方便按照项目自定义的方式对日期时间进行序列化。
objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false);
// 使用JSR310提供的序列化类里面包含了大量的JDK8时间序列化类利用Java 8中对日期时间API的优化更规范、准确地对日期时间类型数据进行序列化和反序列化操作。
objectMapper.registerModule(new JavaTimeModule());
// 启用反序列化所需的类型信息,在属性中添加@class通过这种方式在反序列化时可以明确数据的类型信息有助于正确还原对象类型尤其是在处理多态类型数据时非常重要。
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY);
// 配置null值的序列化器确保在缓存数据中存在null值时也能正确地进行序列化和反序列化操作保证数据的完整性和一致性。
GenericJackson2JsonRedisSerializer.registerNullValueSerializer(objectMapper, null);
return new GenericJackson2JsonRedisSerializer(objectMapper);
}
/**
*
*
* StringRedisTemplateBeanStringRedisTemplateSpring Data RedisRedis
* RedisTemplateSpring便Redis
*
*
* @param redisConnectionFactory RedisStringRedisTemplateRedis访Redis
* @return StringRedisTemplateSpring使Redis便
*/
private ImgUpload imgUpload;
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate(redisConnectionFactory);
redisTemplate.setEnableTransactionSupport(false);
return redisTemplate;
}
}
Loading…
Cancel
Save