.yml设置redis序列化和反序列化方式

时间: 2024-12-05 17:15:14 AIGC 浏览: 87
在Spring Boot中,如果你想要配置Redis的序列化和反序列化策略,通常是在`application.yml`或`.properties`文件中进行配置,涉及到的是`spring.data.redis`部分。这里主要关注的是`spring.redis.serializer`属性: 1. **Jackson2JsonRedisSerializer**:默认的Spring Data Redis使用了Jackson库处理JSON格式的数据序列化。如果你希望继续使用JSON,保持这个默认配置即可。 ```yaml spring: data: redis: serializer: type: Jackson2JsonRedisSerializer ``` 2. **StringRedisSerializer**:如果只需要简单的字符串序列化,可以指定为`StringRedisSerializer`。 ```yaml spring: data: redis: serializer: key-value: string: org.springframework.data.redis.serializer.StringRedisSerializer ``` 3. **JdkSerializationRedisSerializer** 或 **LettuceKryoNativeMessageSerializerFactory**:对于性能优化,可以考虑使用Java自带的序列化方式(`JdkSerializationRedisSerializer`),或者Lettuce库提供的基于Kryo的序列化(适用于较新的版本)。 ```yaml spring: data: redis: serializer: type: JdkSerializationRedisSerializer # 或者 spring: data: redis: lettuce: message-serializer: org.springframework.data.redis.nio.lettuce.LettuceFramingByteArrayMessageSerializer ``` 4. **Hession2JsonRedisSerializer**:如果你的应用之前使用了Hessian序列化,可以配置成Hession。 ```yaml spring: data: redis: serializer: type: com.caucho.hessian2.Hessian2JsonRedisSerializer ``` 记得在启用新序列化方案前,先确保你的数据能够被目标序列化器正确解析。
阅读全文

相关推荐

package vie.control.layer.redis; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.annotation.Order; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.session.data.redis.RedisOperationsSessionRepository; import com.iflytek.sec.uap.cache.session.RedisSessionMappingStorage; import org.springframework.session.web.http.DefaultCookieSerializer; import vie.control.layer.Utils.Sm4Util; @Aspect @Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) @Order(1) @RefreshScope public class RedisConfig extends CachingConfigurerSupport { private static final Logger log = LoggerFactory.getLogger(RedisConfig.class); @Value("${session.timeout.seconds}") private int sessionTimeoutSeconds; @Autowired private RedisProperties redisProperties; @Value("${spring.redis.password}") private String password; @Pointcut("execution(* org.springframework.boot.autoconfigure.data.redis.RedisProperties.getPassword())") public void getRedisConnectionPwd(){} /** * 请求进入前执行 * * @param joinPoint 切点 */ @Before("getRedisConnectionPwd()") public void doBefore(JoinPoint joinPoint) { try { String pwd = Sm4Util.decryptEcb(Sm4Util.generateKey(), password); redisProperties.setPassword(pwd); } catch (Exception e) { e.printStackTrace(); log.error("Sm4Util decode fail [{}}",e); } } /** * session 共享 * * @return */ @Bean @ConditionalOnExpression("'${spring.session.store-type}'.equals('redis')") public RedisSessionMappingStorage sessionMappingStorage( RedisOperationsSessionRepository redisOperationsSessionRepository,RedisConnectionFactory redisConnectionFactory) { RedisSessionMappingStorage sessionMappingStorage = new RedisSessionMappingStorage(); sessionMappingStorage.setRedisTemplate(getRedisTemplate(redisConnectionFactory)); sessionMappingStorage.setRedisOperationsSessionRepository(redisOperationsSessionRepository); sessionMappingStorage.setMaxInactiveIntervalInSeconds(sessionTimeoutSeconds); return sessionMappingStorage; } private RedisTemplate<Object, Object> getRedisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); //redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); //redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } //解决spring session2后端获取的sessionId 和浏览器的cookie中sessionId不一致的问题 @Bean public DefaultCookieSerializer getDefaultCookieSerializer(){ DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer(); cookieSerializer.setUseBase64Encoding(false); return cookieSerializer; } private RedisTemplate<Object, Object> getRedisTemplate(LettuceConnectionFactory redisConnectionFactory){ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } @Primary @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } lettuce客户端自动拓扑刷新