Redis中序列化的两种实现

 更新时间:2024年07月03日 09:15:46   作者:码畜c  
本文主要介绍了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>,使用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 序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Redis高可用集群redis-cluster详解

    Redis高可用集群redis-cluster详解

    redis cluster 是redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了redis分布式的需求,当一个redis节点挂了可以快速的切换到另一个节点,对redis-cluster高可用集群相关知识感兴趣的朋友一起看看吧
    2022-03-03
  • 使用 Redis 流实现消息队列的代码

    使用 Redis 流实现消息队列的代码

    这篇文章主要介绍了使用 Redis 流实现消息队列,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • redis 用scan指令 代替keys指令(详解)

    redis 用scan指令 代替keys指令(详解)

    下面小编就为大家分享一篇redis 用scan指令 代替keys指令详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Redis中LRU淘汰策略的深入分析

    Redis中LRU淘汰策略的深入分析

    这篇文章主要给大家介绍了关于Redis中LRU淘汰策略的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Redis实现主从复制方式(Master&Slave)

    Redis实现主从复制方式(Master&Slave)

    这篇文章主要介绍了Redis实现主从复制方式(Master&Slave),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Windows安装Redis并添加本地自启动服务的实例详解

    Windows安装Redis并添加本地自启动服务的实例详解

    这篇文章主要介绍了Windows安装Redis并添加本地自启动服务的实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 浅谈一下Redis的缓存穿透、击穿和雪崩

    浅谈一下Redis的缓存穿透、击穿和雪崩

    这篇文章主要介绍了浅谈一下Redis缓存穿透、击穿和雪崩,缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果,需要的朋友可以参考下
    2023-08-08
  • Redis客户端及服务端的安装教程详解

    Redis客户端及服务端的安装教程详解

    这篇文章主要介绍了Redis客户端及服务端的安装教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Spark删除redis千万级别set集合数据实现分析

    Spark删除redis千万级别set集合数据实现分析

    这篇文章主要为大家介绍了Spark删除redis千万级别set集合数据实现过程分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 如何利用Redis锁解决高并发问题详解

    如何利用Redis锁解决高并发问题详解

    redis锁处理高并发问题十分常见,下面这篇文章主要给大家介绍了关于如何使用Redis锁解决高并发问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-09-09

最新评论