Hash mapping 哈希映射
在Redis中可以使用多种数据结构类存储数据。前面章节已经学到了关于使用Jackson2JsonRedisSerializer 将objects 转换为JSON格式。JSON能被理想的作为values 来存储,使用一个简单无格式的keys。复杂的objects对象结构可以使用Redis 的Hashes 来存储。Spring Data Redis提供了多种数据映射到hashes 的策略,各个策略的使用取决于使用案例。
1.Direct mapping using HashOperations and a serializer
2.Using Redis Repositories
3.Using HashMapper and HashOperations
1. Hash mappers
Hash mappers是一个转换器,可以 将 map objects 和 Map<K, V>
进行相互转换;HashMapper的目的就是使用Redis Hashes。
大多数实现都是有效的、拿来就可以用的:
1.BeanUtilsHashMapper using Spring’s BeanUtils.
2.ObjectHashMapper using Object to Hash Mapping.
3.Jackson2HashMapper using FasterXML Jackson.
示例代码如下:
public class Person {
String firstname;
String lastname;
// …
}
public class HashMapping {
@Autowired
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);
}
}
2. Jackson2HashMapper
Jackson2HashMapper 使用 FasterXML Jackson提供了 Redis Hash到领域对象之间的映射。Jackson2HashMapper 能映射数据映射,将最高阶层的属性作为Hash域的名字,很随意的就将结构扁平化了。简单类型映射成简单的values。复杂类型(嵌套的objects、collections、maps)会展现成嵌套的JSON。
扁平化将特别的hash 实体转换为嵌套的属性内容,尽可能的将复杂的类型分解为简单的类型。
代码示例如下:
public class Person {
String firstname;
String lastname;
Address address;
}
public class Address {
String city;
String country;
}
objects转换为JSON后的展示:
扁平化要求所有的属性名字不要和JSON的路径有冲突。在进行扁平化时,在map keys中或属性的名字中使用圆点或方括号是不行,不被支持的,违规使用则将导致hash 无法转换回 Object。