【Spring连载】使用Spring Data访问Redis(七)----Hash Mapping
- [一、Hash Mappers](#一、Hash Mappers)
- 二、Jackson2HashMapper
你可以使用Redis中的各种数据结构来存储数据。Jackson2JsonRedisSerializer可以转换JSON格式的对象。理想情况下,通过使用plain键,JSON可以存储为值。通过使用Redis hashes,你可以实现更复杂的结构化对象映射。Spring Data Redis提供了各种将数据映射到哈希的策略(取决于用例):
- 使用HashOperations和序列化程序进行直接映射
- 使用Redis Repositories
- 使用HashMapper和HashOperations
一、Hash Mappers
哈希映射器是将对象和Map<K, V>来回映射的转换器。HashMapper用于Redis Hashes。
有多种实施方式可供选择:
- BeanUtilsHashMapper:使用Spring的BeanUtils。
- ObjectHashMapper:使用对象到哈希映射。
- Jackson2HashMapper:使用FasterXML Jackson。
以下示例展示了一种实现哈希映射的方法:
java
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为域对象(domain objects)提供Redis Hash映射。Jackson2HashMapper可以将顶级属性映射为哈希字段名,还可以选择展平(flatten)结构。简单类型映射到简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套JSON。
扁平化(Flattening)为所有嵌套属性创建单独的哈希条目,并尽可能将复杂类型解析为简单类型。
举例,有以下类及其包含的数据结构:
java
public class Person {
String firstname;
String lastname;
Address address;
Date date;
LocalDateTime localDateTime;
}
public class Address {
String city;
String country;
}
下表展示了前面类中的数据如何在一般映射中显示:
表 1. 一般映射
Hash Field | Value |
---|---|
firstname | Jon |
lastname | Snow |
address | { "city" : "Castle Black", "country" : "The North" } |
date | 1561543964015 |
localDateTime | 2018-01-02T12:13:14 |
下表展示了上述类中的数据在扁平(flat)映射中的显示方式:
表 2. Flat映射
Hash Field | Value |
---|---|
firstname | Jon |
lastname | Snow |
address.city | Castle Black |
address.country | The North |
date | 1561543964015 |
localDateTime | 2018-01-02T12:13:14 |
扁平化要求所有属性名称不干扰JSON路径。使用展平(flattening)时,不支持在映射key中使用点或括号,也不支持将其用作property名称。生成的哈希无法映射回对象。
java.util.Date 和 java.util.Calendar用毫秒表示。如果jackson-datatype-jsr310在类路径上,JSR-310日期/时间类型将序列化为它们的toString形式。