Command Query Responsibility Segregation (CQRS) sépare le comportement de la modification (commande, ajouter, supprimer, modifier, modifier l'état du système) et la requête (requête, requête, ne modifiera pas l'état du système) de l'entreprise. Cela rend la logique plus claire et facilite l'optimisation ciblée de différentes parties.
CQRS a les points suivants:
1. La division du travail est claire et vous pouvez être responsable de différentes parties;
2. La séparation des responsabilités des commandes et des requêtes commerciales peut améliorer les performances, l'évolutivité et la sécurité du système. De plus, il peut maintenir un degré élevé de flexibilité dans l'évolution du système et empêcher la survenue de changements dans une partie dans la requête ou la modification en mode CRUD, entraînant des problèmes avec l'autre partie;
3. Logique claire et peut voir que ces comportements ou opérations dans le système ont provoqué des changements dans l'état du système;
4. Vous pouvez passer de la données, axée sur les données et axée sur les événements.
Par conséquent, Command utilise des bases de données et Query utilise Elasticsearch avec une requête plus efficace.
Comment garantir la cohérence entre les données de base de données et d'Elasticsearch?
Nous pouvons utiliser les données de synchronisation des événements du domaine des données de Spring Data, veuillez vous référer à l'article: http://www.vevb.com/article/135604.htm.
Lorsqu'une ancienne base de données a une grande quantité de données qui doivent être importées dans Elasticsearch, vous pouvez vous référer à l'article: http://www.vevb.com/article/135426.htm
Spring Data ElasticSearch utilise le client Transport, tandis que le site officiel d'Elasticsearch recommande d'utiliser REST Client. Il y a encore des problèmes avec Elasticsearch d'Alibaba Cloud à l'aide du client Transport, et Alibaba Cloud recommande d'utiliser REST Client.
Cet exemple utilise Spring Data Jest Link ElasticSearch (ne prend actuellement en charge que Spring BOOT2.0 ou plus). La version d'Elasticsearch est: 5.5.3
1. Construction du projet
1. Les dépendances de POM sont les suivantes:
<dependency> <proupId> com.github.vanroy </rompuprid> <letifactive> printemps-boot-starter-data-jest </ artifactid> <version> 3.0.0.release </pride> </dEpendency> <Dedency> <proupId> io.searchbox </proupId> <efactId> Jest </ptifActid>
2. Fichier de configuration
Spring: Données: Jest: URI: http://127.0.0.1:9200 Nom d'utilisateur: Mot de passe élastique: Changeme
2. Construire des conditions de requête
Prenez un cours d'entité simple comme exemple
Package com.hfcsbc.esetl.domain; import lombok.data; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.ellasticsearch.annotations.field; Import org.springframework.data.elasticsearch.annotations.fieldype; javax.persistence.entity; import javax.persistence.id; import javax.persistence.onetoone; import java.util.date; import java.util.list; / ** * créer par Pengchao sur 2018/2/23 * / @ document (indexName = "personne", type = "personne", shards = 1, réplique = 0, réfresque = "Personne", shards = 1, réplique = 0, réfres "-1") @ entité @ datapublic class Person {@id private long id; nom de chaîne privé; @OnetoOne @field (type = fieldType.nest) Liste privée <sdress> Adresse; numéro entier privé; Statut entier privé; anniversaire de date privée;} package com.hfcsbc.esetl.domain; import lombok.data; import javax.persistence.entity; import javax.persistence.id; / ** * créer par Pengchao sur 2018/2/23 * / @ entité @ datapublic class adresse {@id private long id; nom de chaîne privé; numéro entier privé;} 1. Requête basée sur plusieurs états (similaire à SQL IN)
Boolquiller OrderstaturScondition = QueryBuilders.BoolQuery (). .Should (queryBuilders.termQuery ("statut", 5)); 2. et requête de liaison (similaire à SQL et)
BoolQueryBuilder QueryBuilder = QueryBuilders.BoolQuery (); QueryBuilder .Must (QueryBuilder1) .Must (QueryBuilder2) .Must (QueryBuilder3);
3. Rangement de rangement (similaire à SQL entre .. et ..)
La copie de code est la suivante:
QueryBuilder RangeQuery = QueryBuilders.RangeQuery ("anniversaire"). De (hier) .to (aujourd'hui);
4. Requête d'objet imbriqué
La copie de code est la suivante:
QueryBuilder QueryBuilder = QueryBuilders.NestedQuery ("imbriqué", queryBuilders.termQuery ("Address.id", 100001), scoremode.none);
Score du score: définit comment le score est utilisé dans d'autres jonins. Si vous ne faites pas attention au score, nous avons juste besoin de le régler sur le score du score. Cette méthode ignorera le score et sera donc plus efficace et enregistrera la mémoire
3. Obtenir des statistiques
1. Somme de données inédite
Sumaggregationbuilder sumbuilder = agrégationbuilders.sum ("sum"). Field ("numéro"); SearchQuery searchQuery = new nativesearchQueryBuilder () .WithIndices (Query_index) .WithTypes (Query_Type). .Addaggregation (sumbuilder) .build (); AggregatedPage <StarkingOrder> Compte = (AggregatedPage <StarkingOrder>) EsparkingOrderRepository.Search (ESQueryBuilders.BuildYesterDayArarsSumQuery (employeeId)); int sum = account.getaggregation ("sum", sumaggregation.class) .getsum (). IntValue (); 2. Somme de données imbriquées
Sumaggregationbuilder sumbuilder = agrégationbuilders.sum ("sum"). Field ("adress.num"); agrégationBuilder agrégationbuilder = agrégationbuilders.neted ("emboîtique", "address"). Subagrégation (sumbuilder); SearchQuergère .WithIndices (query_index) .WithTypes (query_type) .WithQuery (boolQueryBuilder) .Addaggregation ((AbstractaggregationBuilder) AggregationBuilder) .build (); agrégagedPage <StarkerDeder> compte = (AggregatedPage <ParkingOrder>)) EsparkingOrderRepository.Search (EsqueryBuilders.BuildyesterDayArarsSumQuery (employeeId)); int sum = account.getaggregation ("Nest", sumaggregation.class) .getaggregation ("sum", sumaggregation.class) .getsum (). intValue ();Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.