Redis
 sql >> Base de données >  >> NoSQL >> Redis

Interrogation multi-champs sur Redis à l'aide de Redis Spring

Voir Spring Data Redis - 8.5. Index secondaires et :

  • 8.6. Requête par exemple
  • 8.10. Requêtes et méthodes de requête

L'annotation @Indexed ordonne à Spring Data Redis (SDR) de créer un secondaire indexé en tant qu'ensemble pour indexer le champ du hachage.

Cela signifie que lorsque vous insérez des données, SDR exécutera sept commandes vers Redis :

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"

Utilisation de la requête par exemple :

Vous souhaitez créer un dépôt :

interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}

Puis implémentez la requête comme dans l'exemple de service ci-dessous :

class OrgWorkService {

  @Autowired OrgWorkRepository orgWorkRepository;

  List<OrgWork> findOrgWorks(OrgWork probe) {
    return orgWorkRepository.findAll(Example.of(probe));
  }
}

Et utiliser comme :

OrgWork orgWorkExample = new OrgWork();                          
orgWorkExample.setCorpDetails("CorpDetailsValueHere"); 
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);

Dans les coulisses, SDR se chargera de convertir cela en commandes Redis pour obtenir vos données, en utilisant une combinaison de SINTER et HGETALL :

SINTER   …:CorpDetails:CorpDetailsValueHere   …:ContractType:ContractTypeValueHere   ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" 
HGETALL ...

Il s'agit d'un processus en deux étapes :

  1. Récupérer les clés contenues dans l'intersection des index secondaires, en utilisant SINTER
  2. Récupérer chaque clé renvoyée par <1> individuellement, en utilisant HGETALL

Une charge de travail de 100 000 par minute devrait être gérable pour Redis en supposant que vous disposez d'un serveur de qualité, d'une taille d'ensemble de données raisonnable et que les requêtes sont quelque peu spécifiques en moyenne.

SINTER a une complexité temporelle de O(N*M) dans le pire des cas où N est la cardinalité du plus petit ensemble et M est le nombre d'ensembles. Vous disposez d'un ensemble pour chaque dimension de votre requête.

HGETALL est O(N) où N est la taille du hachage, 7 dans votre cas.

Comme toujours, il est recommandé d'effectuer une analyse comparative pour tester si vous obtenez les performances souhaitées et de procéder à des ajustements si nécessaire.