| 此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Redis 3.5.3! | 
对象到哈希映射
Redis 存储库支持将对象持久化为哈希。
这需要一个对象到哈希的转换,这是由一个RedisConverter.
默认实现使用Converter用于将属性值映射到 Redis 原生或映射属性值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 | 简单属性值按路径映射。 | 
| 3 | 复杂类型的属性由其点路径映射。 | 
数据映射和类型转换
本节介绍如何将类型映射到哈希表示形式或映射类型:
| 类型 | 样本 | 映射值 | 
|---|---|---|
| 简单类型 | 字符串 firstname = “rand”; | 名字 = “兰德” | 
| 字节数组 ( | byte[] image = “rand”.getBytes(); | 图片 = “兰德” | 
| 复杂类型 | 地址地址 = new Address(“emond's field”); | address.city = “埃蒙德的领域” | 
| 简单类型列表 | List<String>昵称 = asList(“龙重生”, “lews therin”); | 昵称。[0] = “龙重生”, | 
| 简单类型的地图 | Map<String, String> atts = asMap({“eye-color”, “grey”}, {“... | atts。[eye-color] = “灰色”, | 
| 复杂类型列表 | List<Address> 地址 = asList(new Address(“em... | 地址。[0].city = “Emond 的字段”, | 
| 复合类型 | Map<String, 地址>地址 = asMap({“home”, new Address(“em... | 地址。[home].city = “Emond's field”, | 
| 由于平面表示结构,Map 键需要是简单类型,例如 String或Number. | 
映射行为可以通过注册相应的Converter在RedisCustomConversions.
这些转换器可以负责从单个转换器转换到单个转换器byte[]以及Map<String, byte[]>.
第一个适用于(例如)将复杂类型转换为(例如)仍使用默认映射哈希结构的二进制 JSON 表示形式。
第二个选项提供对生成的哈希的完全控制。
| 将对象写入 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")));
  }
}使用前面的地图Converter生成类似于以下内容的输出:
_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
ciudad = "emond's field"| 自定义转换对索引解析没有影响。仍会创建二级索引,即使对于自定义转换的类型也是如此。 | 
自定义类型映射
如果要避免将整个 Java 类名写入类型信息,而更愿意使用键,可以使用@TypeAlias对要持久化的实体类进行注释。
如果您需要进一步自定义映射,请查看TypeInformationMapper接口。
该接口的实例可以在DefaultRedisTypeMapper,可以配置在MappingRedisConverter.
以下示例演示如何定义实体的类型别名:
@TypeAlias对于实体@TypeAlias("pers")
class Person {
}生成的文档包含pers作为_class田。
配置自定义类型映射
以下示例演示如何配置自定义RedisTypeMapper在MappingRedisConverter:
RedisTypeMapper通过 Spring Java Configclass 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();
  }
}