跳到主要内容
版本:4.1.1

哈希映射

Doubao 中英对照 Hash Mapping

可以使用 Redis 中的各种数据结构来存储数据。JacksonJsonRedisSerializer 可以把对象转换为 JSON 格式。理想情况下,JSON 可以用普通 key 作为值存储。通过使用 Redis 哈希,你可以实现对结构化对象更精细的映射。Spring Data Redis 提供了多种把数据映射到哈希的策略(取决于用例):

Hash Mapper 映射器​

Hash mapper 是把对象与 Map<K, V> 相互转换的转换器。HashMapper 用于与 Redis 哈希配合使用。

有多种实现可用:

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

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);
}
}

JacksonHashMapper​

JacksonHashMapper 通过使用 FasterXML Jackson 3 为领域对象提供 Redis 哈希映射。JacksonHashMapper 可以把顶层属性映射为哈希字段名,并且可选地扁平化结构。简单类型映射为简单值。复杂类型(嵌套对象、集合、map 等)表示为嵌套 JSON。

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

考虑下面这个类及其包含的数据结构:

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

public class Address {
String city;
String country;
}

下表展示在普通映射中,上例类中的数据会如何呈现:

表 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 路径冲突。使用扁平化时,不支持在 map key 中或作为属性名使用点号或方括号。这样得到的哈希无法映射回 Object。

Jackson2HashMapper​

注意

基于 Jackson 2 的实现已被废弃,并将在后续版本中移除。

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

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

考虑下面这个类及其包含的数据结构:

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

public class Address {
String city;
String country;
}

下表展示在普通映射中,上例类中的数据会如何呈现:

表 3. 普通映射

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

下表展示在扁平映射中,上例类中的数据会如何呈现:

表 4. 扁平映射

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

扁平化要求所有属性名都不能与 JSON 路径冲突。使用扁平化时,不支持在 map key 中或作为属性名使用点号或方括号。这样得到的哈希无法映射回 Object。

备注

java.util.Date 和 java.util.Calendar 以毫秒表示。如果 classpath 上有 jackson-datatype-jsr310,JSR-310 日期/时间类型会被序列化为其 toString 形式。