ハッシュマッピング

Redis 内のさまざまなデータ構造を使用してデータを保存できます。Jackson2JsonRedisSerializer (Javadoc) は、オブジェクトを JSON [Wikipedia] (英語) 形式に変換できます。理想的には、プレーンキーを使用して JSON を値として保存できます。Redis ハッシュを使用すると、構造化オブジェクトのより洗練されたマッピングを実現できます。Spring Data、Redis は、データをハッシュにマッピングするためのさまざまな戦略を提供します (ユースケースによって異なります)。

ハッシュマッパー

ハッシュマッパーは、マップオブジェクトを Map<K, V> に変換したり、その逆に変換したりします。HashMapper (Javadoc) は、Redis ハッシュで使用することを目的としています。

複数の実装が利用可能です:

次の例は、ハッシュマッピングを実装する 1 つの方法を示しています。

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 (Javadoc) は、FasterXML Jackson [GitHub] (英語) を使用してドメインオブジェクトの Redis ハッシュマッピングを提供します。Jackson2HashMapper は、最上位のプロパティをハッシュフィールド名としてマッピングし、必要に応じて構造をフラット化できます。単純な型は単純な値にマッピングされます。複雑な型 (ネストされたオブジェクト、コレクション、マップなど) は、ネストされた JSON として表されます。

Flattening は、ネストされたすべてのプロパティに対して個別のハッシュエントリを作成し、可能な限り複雑な型を単純な型に解決します。

次のクラスとそれに含まれるデータ構造について考えてみます。

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

public class Address {
  String city;
  String country;
}

次の表は、前のクラスのデータが法線マッピングでどのように表示されるかを示しています。

表 1: 通常マッピング
ハッシュフィールド

firstname

Jon

lastname

Snow

address

{ "city" : "Castle Black", "country" : "The North" }

date

1561543964015

localDateTime

2018-01-02T12:13:14

次の表は、前のクラスのデータがフラットマッピングでどのように表示されるかを示しています。

表 2: フラットマッピング
ハッシュフィールド

firstname

Jon

lastname

Snow

address.city

Castle Black

address.country

The North

date

1561543964015

localDateTime

2018-01-02T12:13:14

フラット化では、すべてのプロパティ名が JSON パスに干渉しないようにする必要があります。フラット化を使用する場合、マップキーまたはプロパティ名としてドットまたは括弧を使用することはサポートされていません。結果のハッシュをオブジェクトにマップして戻すことはできません。
java.util.Date と java.util.Calendar はミリ秒で表されます。JSR-310 日付 / 時刻型は、jackson-datatype-jsr310 がクラスパス上にある場合、toString 形式に直列化されます。