哈希映射

数据可以使用 Redis 中的各种数据结构进行存储。JacksonJsonRedisSerializer 可以将对象转换为 JSON 格式。 理想情况下,JSON 可以通过普通键作为值进行存储。 您可以通过使用 Redis 哈希来实现更复杂的结构化对象映射。 Spring Data Redis 提供了多种将数据映射到哈希的策略(具体取决于用例):spring-doc.cadn.net.cn

哈希映射器

哈希映射器是将地图对象转换为 Map<K, V> 并转换回来的转换器。HashMapper 旨在与 Redis 哈希一起使用。spring-doc.cadn.net.cn

提供了多种实现:spring-doc.cadn.net.cn

以下示例展示了一种实现哈希映射的方法:spring-doc.cadn.net.cn

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);
  }
}

JacksonHashMapper

JacksonHashMapper 通过使用 FasterXML Jackson 3,为域对象提供 Redis Hash 映射功能。 JacksonHashMapper 可以将顶层属性映射为 Hash 字段名,并可选择性地扁平化结构。 简单类型映射为简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套 JSON。spring-doc.cadn.net.cn

扁平化会为所有嵌套属性创建单独的哈希条目,并尽可能将复杂类型解析为简单类型。spring-doc.cadn.net.cn

请考虑以下类及其所包含的数据结构:spring-doc.cadn.net.cn

public class Person {
  String firstname;
  String lastname;
  Address address;
  Date date;
  LocalDateTime localDateTime;
}

public class Address {
  String city;
  String country;
}

下表展示了前述类中的数据在普通映射中将如何呈现:spring-doc.cadn.net.cn

表1. 普通映射
哈希字段

名称spring-doc.cadn.net.cn

Jonspring-doc.cadn.net.cn

姓氏spring-doc.cadn.net.cn

Snowspring-doc.cadn.net.cn

地址spring-doc.cadn.net.cn

{ "city" : "Castle Black", "country" : "The North" }spring-doc.cadn.net.cn

日期spring-doc.cadn.net.cn

1561543964015spring-doc.cadn.net.cn

localDateTimespring-doc.cadn.net.cn

2018-01-02T12:13:14spring-doc.cadn.net.cn

下表展示了前述类中的数据在扁平映射中将如何呈现:spring-doc.cadn.net.cn

表2. 扁平映射
哈希字段

名称spring-doc.cadn.net.cn

Jonspring-doc.cadn.net.cn

姓氏spring-doc.cadn.net.cn

Snowspring-doc.cadn.net.cn

address.cityspring-doc.cadn.net.cn

Castle Blackspring-doc.cadn.net.cn

address.countryspring-doc.cadn.net.cn

The Northspring-doc.cadn.net.cn

日期spring-doc.cadn.net.cn

1561543964015spring-doc.cadn.net.cn

localDateTimespring-doc.cadn.net.cn

2018-01-02T12:13:14spring-doc.cadn.net.cn

扁平化要求所有属性名称不得与 JSON 路径发生冲突。当使用扁平化时,不支持在 Map 的键或属性名称中使用点号(.)或方括号([])。生成的哈希无法再映射回一个对象。

Jackson2HashMapper

基于 Jackson 2 的实现已被弃用,并将在后续版本中移除。

Jackson2HashMapper 通过使用 FasterXML Jackson 为域对象提供 Redis Hash 映射。 Jackson2HashMapper 可以将顶层属性映射为 Hash 字段名称,并可选择性地扁平化结构。 简单类型映射为简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套 JSON。spring-doc.cadn.net.cn

扁平化会为所有嵌套属性创建单独的哈希条目,并尽可能将复杂类型解析为简单类型。spring-doc.cadn.net.cn

请考虑以下类及其所包含的数据结构:spring-doc.cadn.net.cn

public class Person {
  String firstname;
  String lastname;
  Address address;
  Date date;
  LocalDateTime localDateTime;
}

public class Address {
  String city;
  String country;
}

下表展示了前述类中的数据在普通映射中将如何呈现:spring-doc.cadn.net.cn

表3. 普通映射
哈希字段

名称spring-doc.cadn.net.cn

Jonspring-doc.cadn.net.cn

姓氏spring-doc.cadn.net.cn

Snowspring-doc.cadn.net.cn

地址spring-doc.cadn.net.cn

{ "city" : "Castle Black", "country" : "The North" }spring-doc.cadn.net.cn

日期spring-doc.cadn.net.cn

1561543964015spring-doc.cadn.net.cn

localDateTimespring-doc.cadn.net.cn

2018-01-02T12:13:14spring-doc.cadn.net.cn

下表展示了前述类中的数据在扁平映射中将如何呈现:spring-doc.cadn.net.cn

表4. 扁平映射
哈希字段

名称spring-doc.cadn.net.cn

Jonspring-doc.cadn.net.cn

姓氏spring-doc.cadn.net.cn

Snowspring-doc.cadn.net.cn

address.cityspring-doc.cadn.net.cn

Castle Blackspring-doc.cadn.net.cn

address.countryspring-doc.cadn.net.cn

The Northspring-doc.cadn.net.cn

日期spring-doc.cadn.net.cn

1561543964015spring-doc.cadn.net.cn

localDateTimespring-doc.cadn.net.cn

2018-01-02T12:13:14spring-doc.cadn.net.cn

扁平化要求所有属性名称不得与 JSON 路径发生冲突。当使用扁平化时,不支持在 Map 的键或属性名称中使用点号(.)或方括号([])。生成的哈希无法再映射回一个对象。
java.util.Datejava.util.Calendar 以毫秒表示。如果类路径中包含 toString,则 JSR-310 日期/时间类型将序列化为其 jackson-datatype-jsr310 形式。