跳到主要内容

哈希映射

DeepSeek V3 中英对照 Hash Mapping

在 Redis 中,可以使用各种数据结构来存储数据。Jackson2JsonRedisSerializer 可以将 JSON 格式的对象进行转换。理想情况下,可以通过使用普通键将 JSON 存储为值。通过使用 Redis 哈希,可以实现更复杂的结构化对象映射。Spring Data Redis 提供了多种策略来将数据映射到哈希(具体取决于使用场景):

哈希映射器

Hash mappers 是将 map 对象转换为 Map<K, V> 并转换回来的转换器。HashMapper 旨在与 Redis Hashes 一起使用。

有多个实现可供选择:

以下示例展示了一种实现哈希映射的方法:

public class Person {
String firstname;
String lastname;

// …
}

public class HashMapping {

@Resource(name = "redisTemplate")
HashOperations<String, byte[], byte[]> hashOperations;

HashMapper<Object, byte[], byte[]> mapper = new ObjectHashMapper();

public void writeHash(String key, Person person) {

Map<byte[], byte[]> mappedHash = mapper.toHash(person);
hashOperations.putAll(key, mappedHash);
}

public Person loadHash(String key) {

Map<byte[], byte[]> loadedHash = hashOperations.entries(key);
return (Person) mapper.fromHash(loadedHash);
}
}
java

Jackson2HashMapper

Jackson2HashMapper 通过使用 FasterXML Jackson 为领域对象提供 Redis Hash 映射。Jackson2HashMapper 可以将顶层属性映射为 Hash 字段名称,并可选地展平结构。简单类型映射为简单值。复杂类型(嵌套对象、集合、映射等)则表示为嵌套的 JSON。

扁平化操作为所有嵌套属性创建独立的哈希条目,并尽可能地将复杂类型解析为简单类型。

考虑以下类及其包含的数据结构:

public class Person {
String firstname;
String lastname;
Address address;
Date date;
LocalDateTime localDateTime;
}

public class Address {
String city;
String country;
}
java

下表展示了前面类中的数据在正常映射中的显示方式:

表 1. 法线贴图

哈希字段
firstnameJon
lastnameSnow
address{ "city" : "Castle Black", "country" : "The North" }
date1561543964015
localDateTime2018-01-02T12:13:14

下表展示了前面类中的数据在扁平映射中的呈现方式:

表 2. 扁平映射

哈希字段
firstnameJon
lastnameSnow
address.cityCastle Black
address.countryThe North
date1561543964015
localDateTime2018-01-02T12:13:14
备注

展平操作要求所有属性名称不会干扰 JSON 路径。在使用展平时,不支持在映射键或属性名称中使用点号或方括号。生成的哈希无法映射回对象。

备注

java.util.Datejava.util.Calendar 以毫秒表示。如果 jackson-datatype-jsr310 在类路径上,JSR-310 日期/时间类型将序列化为它们的 toString 形式。