Spring session redis 修改默认的序列化方法(案例)

  • Post category:http

下面我将详细讲解如何在使用Spring session redis时修改默认的序列化方法:

一、背景

在使用Spring session redis时,默认的序列化方式是JdkSerializationRedisSerializer,这种序列化方式是基于Java且能序列话整个对象,但是在实际使用中,对象越复杂,序列化所需要的空间和时间也会越多,因此可以考虑其他的序列化方式,如JsonSerializationRedisSerializerStringRedisSerializer

二、操作步骤

1.在application.properties文件中添加配置

Spring boot中可在application.properties文件中添加如下配置:

# Redis 的主机地址和端口号
spring.redis.host=127.0.0.1
spring.redis.port=6379
# 序列化方式
spring.redis.serializer=jackson

该配置的作用是将序列化方式修改为Jackson2JsonRedisSerializer,该序列化方式是在对象和json之间转换的一种方式,能够更加高效地序列化和反序列化对象,其实现需要依赖jackson-core和jackson-databind两个jar包。

2.自定义序列化

如果要使用其他的序列化方式,比如protobuf等,则需要自定义序列化方式。

示例1:使用Jackson进行序列化

@Configuration
public class RedisConfig {

    /**
     * 将RedisTemplate的序列化方式进行修改
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        // 设置null实例值(关键)
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置redisTemplate模板的序列化方式为json
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        // 设置默认的序列化方式为json
        redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);

        redisTemplate.setEnableDefaultSerializer(true);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

示例2:使用StringRedisSerializer进行序列化

@Configuration
public class RedisConfig {

    /**
     * 将RedisTemplate的序列化方式进行修改为String
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

三、总结

通过修改application.properties文件中的配置和自定义序列化方式,就可以把Spring session Redis的序列化方式修改为其他方式,如JacksonFastJSONprotobuf等,这样可以有效提高对象的序列化和反序列化效率。