Redis リポジトリの構造

ストア自体としての Redis は、非常に狭い低レベル API を提供し、セカンダリインデックスやクエリ操作などの高レベル関数をユーザーに任せます。

このセクションでは、潜在的なパフォーマンスへの影響をよりよく理解するために、リポジトリ抽象化によって発行されたコマンドのより詳細なビューを提供します。

すべての操作の開始点として、次のエンティティクラスを検討してください。

例 1: エンティティの例
@RedisHash("people")
public class Person {

  @Id String id;
  @Indexed String firstname;
  String lastname;
  Address hometown;
}

public class Address {

  @GeoIndexed Point location;
}

新規挿入

repository.save(new Person("rand", "al'thor"));
HMSET "people:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "Person" "id" "19315449-cda2-4f5c-b696-9cb8018fa1f9" "firstname" "rand" "lastname" "al'thor" (1)
SADD  "people" "19315449-cda2-4f5c-b696-9cb8018fa1f9"                           (2)
SADD  "people:firstname:rand" "19315449-cda2-4f5c-b696-9cb8018fa1f9"            (3)
SADD  "people:19315449-cda2-4f5c-b696-9cb8018fa1f9:idx" "people:firstname:rand" (4)
1 平坦化されたエントリをハッシュとして保存します。
2<1> で記述されたハッシュのキーを、同じキースペース内のエンティティのヘルパーインデックスに追加します。
3<2> で記述されたハッシュのキーを、プロパティ値を持つ名のセカンダリインデックスに追加します。
4<3> のインデックスをエントリのヘルパー構造のセットに追加して、削除 / 更新時にクリーンアップするインデックスを追跡します。

既存のものを置き換える

repository.save(new Person("e82908cf-e7d3-47c2-9eec-b4e0967ad0c9", "Dragon Reborn", "al'thor"));
DEL       "people:e82908cf-e7d3-47c2-9eec-b4e0967ad0c9"                           (1)
HMSET     "people:e82908cf-e7d3-47c2-9eec-b4e0967ad0c9" "_class" "Person" "id" "e82908cf-e7d3-47c2-9eec-b4e0967ad0c9" "firstname" "Dragon Reborn" "lastname" "al'thor" (2)
SADD      "people" "e82908cf-e7d3-47c2-9eec-b4e0967ad0c9"                         (3)
SMEMBERS  "people:e82908cf-e7d3-47c2-9eec-b4e0967ad0c9:idx"                       (4)
TYPE      "people:firstname:rand"                                                 (5)
SREM      "people:firstname:rand" "e82908cf-e7d3-47c2-9eec-b4e0967ad0c9"          (6)
DEL       "people:e82908cf-e7d3-47c2-9eec-b4e0967ad0c9:idx"                       (7)
SADD      "people:firstname:Dragon Reborn" "e82908cf-e7d3-47c2-9eec-b4e0967ad0c9" (8)
SADD      "people:e82908cf-e7d3-47c2-9eec-b4e0967ad0c9:idx" "people:firstname:Dragon Reborn" (9)
1 既存のハッシュを削除して、ハッシュキーの残りが存在しなくなる可能性を回避します。
2 平坦化されたエントリをハッシュとして保存します。
3<1> で記述されたハッシュのキーを、同じキースペース内のエンティティのヘルパーインデックスに追加します。
4 更新が必要になる可能性のある既存のインデックス構造を取得します。
5 インデックスが存在するかどうか、およびその型(text、geo、…)を確認してください。
6 潜在的に存在するキーをインデックスから削除します。
7 インデックス情報を保持しているヘルパーを削除します。
8<2> で追加されたハッシュのキーを、プロパティ値を持つ名のセカンダリインデックスに追加します。
9<6> のインデックスをエントリのヘルパー構造のセットに追加して、削除 / 更新時にクリーンアップするインデックスを追跡します。

地理データを保存する

ジオインデックスは、通常のテキストベースのインデックスと同じルールに従いますが、ジオ構造を使用して値を格納します。ジオインデックス付きプロパティを使用するエンティティを保存すると、次のコマンドが実行されます。

GEOADD "people:hometown:location" "13.361389" "38.115556" "76900e94-b057-44bc-abcf-8126d51a621b"  (1)
SADD   "people:76900e94-b057-44bc-abcf-8126d51a621b:idx" "people:hometown:location"               (2)
1 保存したエントリのキーを geo インデックスに追加します。
2 インデックス構造を追跡します。

単純なインデックスを使用して検索

repository.findByFirstname("egwene");
SINTER  "people:firstname:egwene"                     (1)
HGETALL "people:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" (2)
HGETALL ...
1 セカンダリインデックスに含まれるキーをフェッチします。
2<1> から返された各キーを個別に取得します。

ジオインデックスを使用して検索

repository.findByHometownLocationNear(new Point(15, 37), new Distance(200, KILOMETERS));
GEORADIUS "people:hometown:location" "15.0" "37.0" "200.0" "km" (1)
HGETALL   "people:76900e94-b057-44bc-abcf-8126d51a621b"         (2)
HGETALL   ...
1 セカンダリインデックスに含まれるキーをフェッチします。
2<1> から返された各キーを個別に取得します。