用于具有多种类型的嵌套对象的 RedisTemplate 哈希值序列化器

2024-02-29

我正在尝试使用 Redis 为我的实体存储一些缓存数据,其中包含不同类型的字段,例如,

public class Job {
    private String id;
    private Date createTime; //Long
    private String submitterName;
    private JobDefinition jobDef;  //Another class
}

有更多字段,并且由于几个字段比其他字段更新更频繁,我决定保存此字段job作为 Redis 中的 Hashmap,每个字段作为键。这里的嵌套对象就像jobDef并不重要,所以我用了Jackson2JsonRedisSerializer as hashValueSerializer for RedisTemplatejobDefobj 将被序列化为一个长 JSON 字符串,这对我来说完全没问题。

但我不知道如何有效地反序列化整个job从 Redis 返回对象。我设置为反序列化器的类型就像Jackson2JsonRedisSerializer(Map.class)但在反序列化 String 键和值时它会抱怨。

那么这是无效的用法吗RedisTemplate或者我应该如何配置我的序列化器?

编辑: 添加更多代码细节,

    @Autowired
    private StringRedisTemplate redisTemplate; //Here I'm using a String template as I need to use the same redisTemplate for some key-value/list operations too

    Map jobHash= new ObjectMapper().convertValue(job, Map.class);

    redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer(Map.class));

    redisTemplate.opsForHash().putAll("job:"+job.getId(), jobHash); //After this the job hash shows up in Redis as I expected, while the jobDef member is serialized and saved as a JSON string

    Map jobMap = redisTemplate.opsForHash().entries("job:" + job.getId()); //But this won't work as it'll throw exception complaining cannot deserialize a String value to Map. But when I set Jackson2JsonRedisSerializer(String.class) it throws exception that cannot resolve the byte code

第二次编辑:

如果使用JdkSerializationRedisSerializer作为 HashValueSerializer 中RedisTemplate那么反序列化工作正常,但是使用这个的缺点是存储在 Redis 中的值与使用时人类可读的字符串值不同Jackson2JsonRedisSerializer.


The Jackson2JsonRedisSerializer不包括到实际哈希结构的映射信息。 生成的 Redis HASH 结果类似于:

127.0.0.1:6379> hgetall job:1
1) "id"
2) "\"1\""
3) "createTime"
4) "1455778716799"
5) "submitterName"
6) "\"Jon Snow\""
7) "jobDef"
8) "{\"def\":\"nightwatch\"}"

The ObjectMapper产生一个LinkedHashMap为了JobDefinition由于类型未知而无法反序列化的条目。

使用GenericJackson2JsonRedisSerializer包含类型信息,因此生成的 Redis HASH 如下所示:

127.0.0.1:6379> hgetall job:1
1) "id"
2) "\"1\""
...
7) "jobDef"
8) "{\"@class\":\"java.util.LinkedHashMap\",\"def\":\"nightwatch\"}"

这允许正确反序列化值。

另一种方法是NOT使用特定的HashValueSerializer但改为使用DecoratingStringHashMapper随着StringRedisTemplate.

DecoratingStringHashMapper mapper = new DecoratingStringHashMapper<Job>(
  new JacksonHashMapper<Job>(Job.class));

template.opsForHash().putAll("job:" + job.id, mapper.toHash(job));
Map jobMap = template.opsForHash().entries("job:" + job.id); 

The DecoratingStringHashMapper将产生如下 Redis 哈希:

127.0.0.1:6379> hgetall job:1
1) "id"
2) "1"
3) "createTime"
4) "1455780810643"
5) "submitterName"
6) "Jon Snow"
7) "jobDef"
8) "{def=nightwatch}"

不幸的是,这儿没有Jackson2HashMapper。请投票给DATAREDIS-423 https://jira.spring.io/browse/DATAREDIS-423并帮助我们确定优先顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于具有多种类型的嵌套对象的 RedisTemplate 哈希值序列化器 的相关文章

随机推荐

  • 字典中具有多个值的单个键

    我的代码中可以有一个全局字典吗 如下所示 group vowel aa ae ah ao eh er ey ih iy uh uw o consonant b ch d dh dx f g hh jh k l m n ng p r s sh
  • 如何在 xml 布局上使用伴随对象?

    我试图在布局内使用伴随对象属性 但编译器无法识别它 Kotlin 类 class MyClass companion object val SomeProperty hey XML布局
  • 如何在 R 中生成给定的均值、SD、偏度和峰度分布?

    是否可以在 R 中生成均值 SD 偏度和峰度已知的分布 到目前为止 最好的途径似乎是创建随机数并相应地对其进行转换 如果有一个专门用于生成可以适应的特定发行版的包 我还没有找到它 谢谢 SuppDists 包中有一个 Johnson 发行版
  • 使用 R 将 qicharts 图转换为 ggplot

    我的数据框看起来像这样 Datetime lt c 2015 09 29AM 2015 09 29PM 2015 09 30AM 2015 09 30PM 2015 10 01AM 2015 10 01PM 2015 10 02AM 201
  • 从通知中启动的活动按返回/主页退出应用程序

    我有一个从通知启动的活动 我使用 TaskStackBuilder 包含一个后退堆栈 以便当用户点击主页按钮 操作栏标题按钮 或使用后退键时 它将返回到应用程序 但是 它不是以这种方式工作的 而是回击或操作栏标题按钮总是导致应用程序关闭 就
  • JSON.parse 从 JSON 返回 [object]

    我正在使用一个名为的 npm 包request发出 http 请求 现在我想解析收到的数据 以提取经纬度并将其写入我的数据库 但到目前为止 我得到的控制台输出是 address components Object Object Object
  • C# using 和 Java import 之间的区别

    我知道在java中我们使用 星号 来导入包中的所有内容 例如 import java lang 那为什么我们不在C 中使用相同的 星号 来导入所有内容 有没有像java中那样的方法来导入所有内容 有什么区别 import java awt
  • 是否可以使用相同的 requestCode 和不同的 extras 创建多个 PendingIntents ?

    我在用着AlarmManager安排 1 到 35 个警报 取决于用户输入 当用户请求安排新警报时 我需要取消当前警报 因此我使用相同的 requestCode 创建所有警报 该请求代码在final多变的 clear remaining a
  • 如何在 UWP 应用中播放 JS 的声音?

    我正在开发一个 UWP 其中包含一个 Web 应用程序 该应用程序具有一些调用一些 C 函数的 JS 函数 现在 我正在尝试播放我存储在 UWP 应用程序的 Assets 文件夹中的声音 这是我想要发挥的功能Windows 运行时组件 pu
  • html5本地数据库位于客户端计算机上的哪里?

    我正在不同的浏览器 Firefox Opera Safari 和 Chrome 上使用 html5 本地存储 我只是想知道我使用 创建的本地数据库的位置在哪里 开放数据库 我可以更改该数据库的位置吗 Gath 它将存储在用户的配置文件目录中
  • jQuery 的 ajax 成功函数的额外参数

    我正在使用以下代码获取 XML 文件 function getMaps toLoad loadMaps length for var i 0 i lt loadMaps length i ajax type GET url loadMaps
  • 为什么“findById()”在同一实体上调用 getOne() 后返回代理?

    在我的网络应用程序中 在服务布局中 我使用 餐厅 实体的代理 餐厅 字段中的 FetchType Lazy User user userRepository get userId Getting proxy here not restaur
  • 如何在 docker 容器中对 elasticsearch.yml 进行简单编辑?

    我在用docker compose as in https github com davidefiocco dockerized elasticsearch indexer blob master docker compose yml ht
  • 为什么 html5 postMessage 对我不起作用?

    我使用几行 javascript 来创建一个 iframe 元素 然后我想向它发送一条消息 如下所示 function loadiframe callback var body document getElementsByTagName b
  • 如何修改和使用R包的函数?

    我的问题是关于如何在 R 中调整 控制树状图中的比例 使用 portfolio 库 https stackoverflow com questions 7561423 how do you adjust control the scale
  • 溢出:滚动;在 中

    为什么 CSS 属性overflow scroll 不工作于 td while overflow hidden 效果很好 table border 1 style width 100px tr td style width 50px 100
  • CF9 中的 QueryNew() 数据类型

    我接管了运行 CF9 0 1 的生产服务器上的系统 但在开发人员版本中找不到该系统的副本 因此我正在运行 CF10 我正在将数据从数据库导出到 Excel 由于数据来自多个数据源 因此需要手动将结果输入到查询中 然后用于输出到 Excel
  • 如何比较/匹配两个不相同的声音片段

    我需要每 5 秒采集一次短声音样本 然后将其上传到我们的云服务器 然后 我需要找到一种方法来比较 检查该样本是否是完整长音频文件的一部分 样本将通过手机麦克风录制 因此它们确实不准确 我知道这个主题可能会变得非常技术性和复杂 但我确信一定有
  • Firestore 写入限制错误代码

    Firestore 目前处于测试阶段 并且有每秒写入次数限制 写入 Firestore 数据库时是否可以检查特定的 Firestore 写入错误代码 我的用例是我需要具有查询可能性的高吞吐量 通过检查写入错误代码 我可以稍后重试写入 根据官
  • 用于具有多种类型的嵌套对象的 RedisTemplate 哈希值序列化器

    我正在尝试使用 Redis 为我的实体存储一些缓存数据 其中包含不同类型的字段 例如 public class Job private String id private Date createTime Long private Strin