IT俱乐部 Redis Redis中序列化的两种实现

Redis中序列化的两种实现

序列化方式概述

对比同份数据初次序列化时的情况(很多帖子都没有考虑序列化的同份数据是否为二次加载的情况,就给出了结论)

  • StringRedisSerializer: 简单的字符串序列化,可视化性好(内部就是通过String类的new String(bytes) & string.getBytes()实现的序列化)
  • JdkSerializationRedisSerializer: Java提供的序列化方式,效率高,占用空间少,可视化性差
  • Jackson2JsonRedisSerializer: 序列化为json字符串,效率低于JdkSerializationRedisSerializer,占用空间多,可视化性好,默认情况下对泛型支持差
  • GenericJackson2JsonRedisSerializer: 序列化为json字符串,效率同Jackson2JsonRedisSerializer,占用空间多,可视化性好,默认情况下对泛型支持友好

Jackson2JsonRedisSerializer 对比 GenericJackson2JsonRedisSerializer

Jackson2JsonRedisSerializer

[
    {
        "id": "1",
        "parentId": "2",
        "content": "Node1",
        "children": null
    },
    {
        "id": null,
        "parentId": null,
        "content": null,
        "children": null
    }
]

GenericJackson2JsonRedisSerializer

[
    "java.util.ArrayList",
    [
        {
            "@class": "life.cqq.blog.common.entity.Toc",
            "id": "1",
            "parentId": "2",
            "content": "Node1",
            "children": null
        },
        {
            "@class": "life.cqq.blog.common.entity.Toc",
            "id": null,
            "parentId": null,
            "content": null,
            "children": null
        }
    ]
]

上面分别是两种序列化方式的结果,

GenericJackson2JsonRedisSerializer根据额外插入的类全限定名通过反射可以正确得到实体类的实例。

而Jackson2JsonRedisSerializer由于没有插入额外的信息,那么只能通过不同的数据结构来组装反序列化后的内容。例如上面的Json串反序列化的结果类型为: ArrayList,使用LinkedHashMap来组装实体类对象的字段与字段值。

为什么会这样?

二者本质都是使用的ObjectMapper,只不过GenericJackson2JsonRedisSerializer在内部对ObjectMapper进行了特定配置而已:

public GenericJackson2JsonRedisSerializer() {
    this((String) null);
}

public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {

    this(new ObjectMapper());

    registerNullValueSerializer(mapper, classPropertyTypeName);

    // 下面的配置就是在序列化结果中加入实体类全限定名的配置 
    if (StringUtils.hasText(classPropertyTypeName)) {
        mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);
    } else {
        mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
    }
}

public GenericJackson2JsonRedisSerializer(ObjectMapper mapper) {
    Assert.notNull(mapper, "ObjectMapper must not be null!");
    this.mapper = mapper;
}

使用Jackson2JsonRedisSerializer时,可以自己创建一个ObjectMapper对象,并进行上面的配置后,通过构造方法进行传递。那么最后Jackson2JsonRedisSerializer的序列化效果和GenericJackson2JsonRedisSerializer是一样的。

常用配置

根据以上内容,给出一份RedisTemplate的常用配置:

@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

    // key   采用StringRedisSerializer
    // value 采用GenericJackson2JsonRedisSerializer

    RedisTemplate template = new RedisTemplate();
    // 关闭启用默认配置
    template.setEnableDefaultSerializer(false);
    // 连接工厂
    template.setConnectionFactory(factory);
    // key 序列化方式
    template.setKeySerializer(RedisSerializer.string());
    // value 序列化方式
    template.setValueSerializer(RedisSerializer.json());
    // hash key 序列化方式
    template.setHashKeySerializer(RedisSerializer.string());
    // hash value 序列化方式
    template.setHashValueSerializer(RedisSerializer.json());
    // 配置完成
    template.afterPropertiesSet();
    return template;
}

到此这篇关于Redis中序列化的两种实现的文章就介绍到这了,更多相关Redis 序列化内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部! 

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/database/redis/12989.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部