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出现闪退情况的解决办法

    最近使用Redis遇到启动闪退的问题,查阅资料后在一位大神的文章中找到了答案,这篇文章主要给大家介绍了关于启动redis出现闪退情况的解决办法,需要的朋友可以参考下
    2023-11-11
  • Redis实现编码生成规则方式

    Redis实现编码生成规则方式

    在自动生成编码时应采用“MD+年月日+4位序列号”的规则,如“MD202310130001”,为避免使用随机序列号导致的重复编码,建议使用从0开始的自增序列号,此外,使用Redis的incrBy功能实现序列号自增,可以有效提高效率和降低实现难度
    2023-01-01
  • redis中opsForList().range()的使用方法详解

    redis中opsForList().range()的使用方法详解

    这篇文章主要给大家介绍了关于redis中opsForList().range()的使用方法,文中通过实例代码以及图文介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • Redis分布式锁防止缓存击穿的实现

    Redis分布式锁防止缓存击穿的实现

    本文主要介绍了Redis分布式锁防止缓存击穿的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Redis中TYPE命令的具体使用

    Redis中TYPE命令的具体使用

    本文主要介绍了Redis中TYPE命令的具体使用,它用于返回存储在指定键中的值的数据类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 深入解析Redis中常见的应用场景

    深入解析Redis中常见的应用场景

    这篇文章主要给大家介绍了关于Redis中常见的应用场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • 一步步教会你redis如何配置密码

    一步步教会你redis如何配置密码

    Redis的配置文件中可以设置密码来保护访问,下面这篇文章主要给大家介绍了关于redis如何配置密码的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • redis内存空间效率问题的深入探究

    redis内存空间效率问题的深入探究

    redis缓存固然高效,可是它会占用我们系统中宝贵的内存资源,那该如何解决呢?这篇文章主要给大家介绍了关于redis内存空间效率问题的相关资料,需要的朋友可以参考下
    2021-05-05
  • Redis禁用命令、危险命令及规避方法

    Redis禁用命令、危险命令及规避方法

    这篇文章主要介绍了Redis禁用命令、危险命令及规避方法,本文介绍了个非常致命的两个命令以及用配置文件禁用这些命令的方法,需要的朋友可以参考下
    2015-06-06
  • Redis分布式锁如何实现续期

    Redis分布式锁如何实现续期

    这篇文章主要介绍了Redis分布式锁如何实现续期的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论