哈希映射
可以使用 Redis 中的各种数据结构来存储数据。JacksonJsonRedisSerializer 可以把对象转换为 JSON 格式。理想情况下,JSON 可以用普通 key 作为值存储。通过使用 Redis 哈希,你可以实现对结构化对象更精细的映射。Spring Data Redis 提供了多种把数据映射到哈希的策略(取决于用例):
- 直接映射,通过使用 HashOperations 和一个序列化器
- 使用 Redis Repositories
- 使用 HashMapper 和 HashOperations
Hash Mapper 映射器
Hash mapper 是把对象与 Map<K, V> 相互转换的转换器。HashMapper 用于与 Redis 哈希配合使用。
有多种实现可用:
- BeanUtilsHashMapper,使用 Spring 的 BeanUtils。
- ObjectHashMapper,使用对象到哈希映射。
- JacksonHashMapper,使用 FasterXML Jackson 3。
- Jackson2HashMapper(已废弃),使用 FasterXML Jackson 2。
下例展示了实现哈希映射的一种方式:
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. 普通映射
| 哈希字段 | 值 |
|---|---|
| firstname | Jon |
| lastname | Snow |
| address | { "city" : "Castle Black", "country" : "The North" } |
| date | 1561543964015 |
| localDateTime | 2018-01-02T12:13:14 |
下表展示在扁平映射中,上例类中的数据会如何呈现:
表 2. 扁平映射
| 哈希字段 | 值 |
|---|---|
| firstname | Jon |
| lastname | Snow |
| address.city | Castle Black |
| address.country | The North |
| date | 1561543964015 |
| localDateTime | 2018-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. 普通映射
| 哈希字段 | 值 |
|---|---|
| firstname | Jon |
| lastname | Snow |
| address | { "city" : "Castle Black", "country" : "The North" } |
| date | 1561543964015 |
| localDateTime | 2018-01-02T12:13:14 |
下表展示在扁平映射中,上例类中的数据会如何呈现:
表 4. 扁平映射
| 哈希字段 | 值 |
|---|---|
| firstname | Jon |
| lastname | Snow |
| address.city | Castle Black |
| address.country | The North |
| date | 1561543964015 |
| localDateTime | 2018-01-02T12:13:14 |
扁平化要求所有属性名都不能与 JSON 路径冲突。使用扁平化时,不支持在 map key 中或作为属性名使用点号或方括号。这样得到的哈希无法映射回 Object。
java.util.Date 和 java.util.Calendar 以毫秒表示。如果 classpath 上有 jackson-datatype-jsr310,JSR-310 日期/时间类型会被序列化为其 toString 形式。