Skip to content

RedisTemplate 字符串序列化

在使用 RedisTemplate 时,自定义序列化器,使用JackSon进行序列化操作

java
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);
    Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    mapper.registerModule(new Jdk8Module())
            .registerModule(new JavaTimeModule())
            .registerModule(new ParameterNamesModule());
    serializer.setObjectMapper(mapper);

    // 使用StringRedisSerializer来序列化和反序列化redis的key值
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(serializer);

    // Hash的key也采用StringRedisSerializer的序列化方式
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(serializer);

    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}
java
@Autowired
private RedisTemplate<Object, Object> redisTemplate;

public void test(){
    redisTemplate.opsForValue().set("tested", "aaa");
}

在使用时发现获取到的值是"aaa",多了双引号,以为是存储的问题,后来发现这里注入的是我们定义的RedisTemplate,所以这个字符串也被Jackson序列化了,所以两边多了双引号。

对于值类型我们确定不需要序列化,而且在使用时确实不会反序列化json的,我们可以直接使用默认的RedisTemplate,即直接注入RedisTemplate<String, String>