Java Web技术之Redis(04) - 序列化与反序列化

一、介绍

       Redis虽然提供了对string(字符串),hash(哈希),list(列表),set(集合)及zset等数据类型的支持,但没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储。
       spring-data-redis提供了若干个Serializer,主要包括:

      (1)JdkSerializationRedisSerializer——使用Java自带的序列化机制将对象序列化为一个字符串(spring默认序列化方式);

      (2)OxmSerializer——将对象序列化为xml字符串;

      (3)Jackson2JsonRedisSerializer——将对象序列化为json字符串;

      (4)StringRedisSerializer——简单字符串到byte []序列化。

二、自定义序列化方式

       1.创建DefRedisSerializer类

/**
 * <B>概要:</B><br>自定义序列化器</br>
 * <P><B>详细说明:</B><br></br></P>
 *
 * @author Eternal_L
 * @version 1.00
 * @date 2018/10/22
 * @since JDK 1.8
 */
public class DefRedisSerializer {
    
    /**
     * stringRedisSerializer
     *
     * @return stringRedisSerializer
     */
    public static StringRedisSerializer stringRedisSerializer() {
        return new StringRedisSerializer();
    }
    
    /**
     * jackson2JsonRedisSerializer
     *
     * @return jackson2JsonRedisSerializer
     */
    public static Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer() {
        // 使用Jackson2JsonRedisSerialize替换默认序列化
        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);
        // 返回
        return jackson2JsonRedisSerializer;
    }
    
}

       2.创建RedisConfig类

/**
 * <B>概要:</B><br>Redis 配置</br>
 * <P><B>详细说明:</B><br></br></P>
 *
 * @author Eternal_L
 * @version 1.00
 * @date 2018/10/22
 * @since JDK 1.8
 */
@EnableCaching
@Configuration
public class RedisConfig {
    
    /**
     * redisTemplate
     *
     * @return RedisTemplate
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 设置key和value的序列化规则
        redisTemplate.setKeySerializer(DefRedisSerializer.stringRedisSerializer());
        redisTemplate.setValueSerializer(DefRedisSerializer.jackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(DefRedisSerializer.jackson2JsonRedisSerializer());
        redisTemplate.setHashValueSerializer(DefRedisSerializer.jackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    
}

三、测试

       在上一章QuickSart项目中加入上面两个类,重新运行测试用例,将得到如下图结果:

       

猜你喜欢

转载自www.cnblogs.com/rn-yx/p/9828143.html