此版本仍在开发中,尚未被视为稳定版本。如需最新的稳定版本,请使用 Spring Data Redis 3.4.0! |
对象到哈希映射
Redis 存储库支持将对象持久化为哈希。
这需要对象到哈希的转换,该转换由 .
默认实现用于与 Redis native 之间映射属性值。RedisConverter
Converter
byte[]
给定前面部分的类型,默认映射如下所示:Person
_class = org.example.Person (1)
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand (2)
lastname = al’thor
address.city = emond's field (3)
address.country = andor
1 | 该属性包含在根级别以及任何嵌套接口或抽象类型中。_class |
2 | 简单属性值按 path 进行映射。 |
3 | 复杂类型的属性由其点路径映射。 |
数据映射和类型转换
本节解释了如何将类型映射到 Hash 表示形式或从 Hash 表示形式映射类型:
类型 | 样本 | 映射值 |
---|---|---|
简单类型 |
字符串 firstname = “rand”; |
firstname = “兰德” |
字节数组 ( |
byte[] image = “rand”.getBytes(); |
image = “兰德” |
复杂类型 |
地址 address = new Address(“emond 的字段”); |
address.city = “伊蒙德的田野” |
简单类型列表 |
List<String> 昵称 = asList(“dragon reborn”, “lews therin”); |
昵称。[0] = “Dragon Reborn”, |
简单类型的映射 |
Map<String, String> atts = asMap({“eye-color”, “grey”}, {“... |
阿茨。[eye-color] = “grey”, |
复杂类型列表 |
List<Address> addresses = asList(new Address(“em... |
地址。[0].city = “伊蒙德的田野”, |
复杂类型的映射 |
Map<String, Address> addresses = asMap({“home”, new Address(“em... |
地址。[home].city = “伊蒙德的田野”, |
由于平面表示结构,Map 键需要是简单类型,例如 或 。String Number |
可以通过在 中注册相应的 来自定义映射行为。
这些转换器可以处理从 single 和 .
第一个方法适用于(例如)将复杂类型转换为(例如)仍然使用默认 mappings 哈希结构的二进制 JSON 表示形式。
第二个选项提供对结果哈希的完全控制。Converter
RedisCustomConversions
byte[]
Map<String, byte[]>
将对象写入 Redis 哈希会删除哈希中的内容并重新创建整个哈希,因此尚未映射的数据将丢失。 |
以下示例显示了两个示例字节数组转换器:
@WritingConverter
public class AddressToBytesConverter implements Converter<Address, byte[]> {
private final Jackson2JsonRedisSerializer<Address> serializer;
public AddressToBytesConverter() {
serializer = new Jackson2JsonRedisSerializer<Address>(Address.class);
serializer.setObjectMapper(new ObjectMapper());
}
@Override
public byte[] convert(Address value) {
return serializer.serialize(value);
}
}
@ReadingConverter
public class BytesToAddressConverter implements Converter<byte[], Address> {
private final Jackson2JsonRedisSerializer<Address> serializer;
public BytesToAddressConverter() {
serializer = new Jackson2JsonRedisSerializer<Address>(Address.class);
serializer.setObjectMapper(new ObjectMapper());
}
@Override
public Address convert(byte[] value) {
return serializer.deserialize(value);
}
}
使用前面的字节数组会产生类似于以下内容的输出:Converter
_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
address = { city : "emond's field", country : "andor" }
以下示例显示了两个转换器示例:Map
@WritingConverter
public class AddressToMapConverter implements Converter<Address, Map<String, byte[]>> {
@Override
public Map<String, byte[]> convert(Address source) {
return singletonMap("ciudad", source.getCity().getBytes());
}
}
@ReadingConverter
public class MapToAddressConverter implements Converter<Map<String, byte[]>, Address> {
@Override
public Address convert(Map<String, byte[]> source) {
return new Address(new String(source.get("ciudad")));
}
}
使用前面的 Map 将生成类似于以下内容的输出:Converter
_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
ciudad = "emond's field"
自定义转化对索引分辨率没有影响。即使对于自定义转换的类型,仍会创建二级索引。 |
自定义类型映射
如果要避免将整个 Java 类名编写为类型信息,而希望使用键,则可以在正在保留的实体类上使用注释。
如果需要进一步自定义映射,请查看 TypeInformationMapper
界面。
可以在 上配置该接口的实例,该实例可以在 上配置。@TypeAlias
DefaultRedisTypeMapper
MappingRedisConverter
以下示例演示如何为实体定义类型别名:
@TypeAlias
@TypeAlias("pers")
class Person {
}
生成的文档包含字段中的值。pers
_class
配置自定义类型映射
以下示例演示如何在 中配置自定义 :RedisTypeMapper
MappingRedisConverter
RedisTypeMapper
class CustomRedisTypeMapper extends DefaultRedisTypeMapper {
//implement custom type mapping here
}
@Configuration
class SampleRedisConfiguration {
@Bean
public MappingRedisConverter redisConverter(RedisMappingContext mappingContext,
RedisCustomConversions customConversions, ReferenceResolver referenceResolver) {
MappingRedisConverter mappingRedisConverter = new MappingRedisConverter(mappingContext, null, referenceResolver,
customTypeMapper());
mappingRedisConverter.setCustomConversions(customConversions);
return mappingRedisConverter;
}
@Bean
public RedisTypeMapper customTypeMapper() {
return new CustomRedisTypeMapper();
}
}