SpringDataRedis-8.5を参照してください。二次インデックスと:
- 8.6。例によるクエリ
- 8.10。クエリとクエリメソッド
アノテーション@Indexed
Spring Data Redis(SDR)に、ハッシュのフィールドにインデックスを付けるためのセットとしてインデックスが付けられたセカンダリを作成するように指示します。
これは、データを挿入すると、SDRがRedisに対して7つのコマンドを実行することを意味します:
HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork"
"id" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
"CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere"
... "Country" "Costa Rica"
SADD "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
...
SADD "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
例によるクエリの使用:
リポジトリを作成したい:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
次に、以下のサービス例のようにクエリを実装します。
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
そして、次のように使用します:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
舞台裏では、SDRがSINTERとHGETALLの組み合わせを使用して、これをRedisコマンドに変換してデータを取得します。
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
これは2段階のプロセスです:
-
SINTER
を使用して、セカンダリインデックスの共通部分に含まれるキーを取得します -
HGETALL
を使用して、<1>から返された各キーを個別に取得します
高品質のサーバーと妥当なデータセットサイズがあり、クエリが平均してある程度具体的であると仮定すると、Redisでは1分あたり100,000のワークロードを管理できるはずです。
SINTER
時間計算量はO(N * M)ワーストケースで、Nは最小セットのカーディナリティ、Mはセット数です。クエリのディメンションごとに1つのセットがあります。
HGETALL
はO(N)です。ここで、Nはハッシュのサイズで、この場合は7です。
いつものように、ベンチマークを実行して、目的のパフォーマンスが得られているかどうかをテストし、必要に応じて調整することをお勧めします。