当前位置: 代码网 > it编程>数据库>Redis > Redis中序列化的两种实现

Redis中序列化的两种实现

2024年09月07日 Redis 我要评论
序列化方式概述对比同份数据初次序列化时的情况(很多帖子都没有考虑序列化的同份数据是否为二次加载的情况,就给出了结论)stringredisserializer: 简单的字符串序列化,可视化性好(内部就

序列化方式概述

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

  • 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>,使用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<string, object> redistemplate(redisconnectionfactory factory) {

    // key   采用stringredisserializer
    // value 采用genericjackson2jsonredisserializer

    redistemplate<string, object> 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 序列化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com