哈希映射
在 Redis 中,可以使用各种数据结构来存储数据。Jackson2JsonRedisSerializer 可以将 JSON 格式的对象进行转换。理想情况下,可以通过使用普通键将 JSON 存储为值。通过使用 Redis 哈希,可以实现更复杂的结构化对象映射。Spring Data Redis 提供了多种策略来将数据映射到哈希(具体取决于使用场景):
-
直接映射,通过使用 HashOperations 和 序列化器
-
使用 Redis 仓库
-
使用 HashMapper 和 HashOperations
哈希映射器
Hash mappers 是将 map 对象转换为 Map<K, V>
并转换回来的转换器。HashMapper 旨在与 Redis Hashes 一起使用。
有多个实现可供选择:
-
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);
}
}
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;
}
下表展示了前面类中的数据在正常映射中的显示方式:
表 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 路径。在使用展平时,不支持在映射键或属性名称中使用点号或方括号。生成的哈希无法映射回对象。
java.util.Date
和 java.util.Calendar
以毫秒表示。如果 jackson-datatype-jsr310
在类路径上,JSR-310 日期/时间类型将序列化为它们的 toString
形式。