当前位置: 首页 > 知识库问答 >
问题:

Spring Data Cache Redis:如何避免在序列化JSON中存储类名,这会浪费大量空间?

孙修德
2023-03-14

我使用的是Spring数据缓存,使用Redis作为缓存管理器。配置如下:

    return RedisCacheManager.builder(redisConnectionFactory)
        .cacheDefaults(
            RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(SerializationPair.fromSerializer(RedisSerializer.string()))
                .serializeValuesWith(SerializationPair.fromSerializer(RedisSerializer.json()))
        )
        .build()

让我们想象一个使用spring数据缓存的非常简单的例子:

@Cacheable(...)
MyPOJO compute() { ... }

但是,RedisSerializer.json()确实是一个GenericJackson2JsonRedisSerializer。因此,恕我直言,它将存储像{"Hello":"world","@class":"com.my.name.some.package.MyPOJO"}这样的东西。@class:...部分很长,在Redis中浪费了宝贵的内存。此外,恕我直言Spring Data Cache应该足够聪明,能够意识到值类型确实是MyPOJO,因此它不应该需要存储那个"@class"

因此,我的问题是:在Spring Data Cache Redis CacheManager中,如何避免在序列化JSON中存储类名,这会浪费大量空间?

谢谢你的建议!

共有1个答案

能正青
2023-03-14

您研究过GenericJackson2JsonRedisSerializer的实现吗?看起来默认的对象映射器配置为使用Jacksons多态类型功能。但也有一个选项可以像这样传递自定义ObjectMapper:

SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper))

您可以配置并传递自定义Jacksons对象映射器,包括或不包括类型信息。有几种方法可以配置类型信息的存储方式(如果您确实需要):https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

在早期版本中,Spring没有配置类型信息,如图所示:如何使用GenericJackson2JsonRedisSerializer在较新的版本中,这一点似乎有所改变。但是,仍然可以根据需要配置序列化程序

 类似资料:
  • 问题内容: 我使用hibernate方式检索兄弟列表 Hibernate是在兄弟列表中使用惰性选择配置的,在Java端这是可行的,但是问题是当我想将Brother对象序列化为JSON时。 例如,布莱恩(Bryan)可以将马克(Mark)当作兄弟,反之亦然… 我该如何解决?有什么办法可以指示对杰克逊库的最大递归次数? 我的代码,真的很简单。 问题答案: 由于 循环参考出现问题 。 由于您可以使用两个

  • 我正在使用Jackson 2库,我正在尝试反序列化JSON响应,如下所示: 出于某些原因,我的员工数组中有一个空元素。在反序列化过程中,是否可以丢弃该元素并避免反序列化它?目前,我的代码将空员工反序列化为具有空字段的员工 POJO 类。 我的代码如下所示: 附言。我不能碰JSON响应。它就是这样…

  • 问题内容: 最近,我被分配创建拍卖系统的任务。在我的工作中,我遇到了无数次由于列名不明确而导致包含联接的SQL查询无法执行的情况。考虑以下(简化的)拍卖表结构: 表: (创建拍卖的用户的ID) 表: (添加项目的用户的ID) (有该物品的拍卖的ID) (初始价格) 表: 表: (出价的用户的ID) (已提高价格的项目) (优惠价格) 如您所见,有许多列具有冲突的名称。连接这些表需要采取一些措施来消

  • 我试图在Laravel中加入3个表后查看特定表的日期。但是它只显示一个表的信息。 下面是连接3个表的代码: 路由文件: 下面是查看刀片模板中信息的脚本 刀片中的代码: 这里我想查看发票的创建日期,但它显示了subscribers表中订户的创建日期。但我想从发票表中查看发票的具体日期。 我该怎么做?当做

  • 我有一个错误: 我一直试图避免导致此被序列化的字段,但错误没有得到纠正。我试图把@JsonIgnore放在任何地方,在getter、setter、属性和所有可能的组合中。 谢啦 - 我无法导入com。谷歌。阿彭金。重新包装。组织。科德豪斯。杰克逊。注释JsonIgnoreProperties说,“使用com.google.appengine.repacked可能会导致你的应用程序在没有警告的情况下

  • 我正在使用Guava缓存热数据。当缓存中不存在数据时,我必须从数据库中获取数据: 我的问题是当数据不存在于数据库中时,我希望它返回并且不做任何缓存。但Guava保存与缓存中的关键字,并抛出一个异常,当我得到它: com.google.common.cache.CacheLoader$InvalidCacheLoadExcION: CacheLoader为shisoft键返回null。 我们如何避免