sql >> データベース >  >> NoSQL >> Redis

RedisSpringを使用したRedisでのマルチフィールドクエリ

    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段階のプロセスです:

    1. SINTERを使用して、セカンダリインデックスの共通部分に含まれるキーを取得します
    2. HGETALLを使用して、<1>から返された各キーを個別に取得します

    高品質のサーバーと妥当なデータセットサイズがあり、クエリが平均してある程度具体的であると仮定すると、Redisでは1分あたり100,000のワークロードを管理できるはずです。

    SINTER 時間計算量はO(N * M)ワーストケースで、Nは最小セットのカーディナリティ、Mはセット数です。クエリのディメンションごとに1つのセットがあります。

    HGETALL はO(N)です。ここで、Nはハッシュのサイズで、この場合は7です。

    いつものように、ベンチマークを実行して、目的のパフォーマンスが得られているかどうかをテストし、必要に応じて調整することをお勧めします。




    1. mongodbでネストされたフィールドを選択します

    2. HerokuでRedisの接続が拒否されました

    3. Redisでセットを空/削除しますか?

    4. Mongoid:IDの配列から検索