|
此版本仍在开发中,尚未被视为稳定版本。如需使用最新稳定版本,请访问 Spring Data Redis 4.0.4! |
哈希映射
数据可以使用 Redis 中的各种数据结构进行存储。JacksonJsonRedisSerializer 可以将对象转换为 JSON 格式。
理想情况下,JSON 可以通过普通键作为值进行存储。
您可以通过使用 Redis 哈希来实现更复杂的结构化对象映射。
Spring Data Redis 提供了多种将数据映射到哈希的策略(具体取决于用例):
-
直接映射,使用
HashOperations和一个 序列化器 -
使用Redis 仓库
-
使用
HashMapper和HashOperations
哈希映射器
哈希映射器是将地图对象转换为 Map<K, V> 并转换回来的转换器。HashMapper 旨在与 Redis 哈希一起使用。
提供了多种实现:
-
BeanUtilsHashMapper使用 Spring 的 BeanUtils。
以下示例展示了一种实现哈希映射的方法:
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 Hash 映射功能。
JacksonHashMapper 可以将顶层属性映射为 Hash 字段名,并可选择性地扁平化结构。
简单类型映射为简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套 JSON。
扁平化会为所有嵌套属性创建单独的哈希条目,并尽可能将复杂类型解析为简单类型。
请考虑以下类及其所包含的数据结构:
public class Person {
String firstname;
String lastname;
Address address;
Date date;
LocalDateTime localDateTime;
}
public class Address {
String city;
String country;
}
下表展示了前述类中的数据在普通映射中将如何呈现:
| 哈希字段 | 值 |
|---|---|
名称 |
|
姓氏 |
|
地址 |
|
日期 |
1561543964015 |
localDateTime |
|
下表展示了前述类中的数据在扁平映射中将如何呈现:
| 哈希字段 | 值 |
|---|---|
名称 |
|
姓氏 |
|
address.city |
|
address.country |
|
日期 |
1561543964015 |
localDateTime |
|
| 扁平化要求所有属性名称不得与 JSON 路径发生冲突。当使用扁平化时,不支持在 Map 的键或属性名称中使用点号(.)或方括号([])。生成的哈希无法再映射回一个对象。 |
Jackson2HashMapper
| 基于 Jackson 2 的实现已被弃用,并将在后续版本中移除。 |
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;
}
下表展示了前述类中的数据在普通映射中将如何呈现:
| 哈希字段 | 值 |
|---|---|
名称 |
|
姓氏 |
|
地址 |
|
日期 |
|
localDateTime |
|
下表展示了前述类中的数据在扁平映射中将如何呈现:
| 哈希字段 | 值 |
|---|---|
名称 |
|
姓氏 |
|
address.city |
|
address.country |
|
日期 |
|
localDateTime |
|
| 扁平化要求所有属性名称不得与 JSON 路径发生冲突。当使用扁平化时,不支持在 Map 的键或属性名称中使用点号(.)或方括号([])。生成的哈希无法再映射回一个对象。 |
java.util.Date 和 java.util.Calendar 以毫秒表示。如果类路径中包含 toString,则 JSR-310 日期/时间类型将序列化为其 jackson-datatype-jsr310 形式。 |