Befehlsabfrageverantwortung Segregation (CQRS) trennt das Verhalten von Änderungen (Befehl, hinzufügen, löschen, ändern, den Systemstatus ändern) und Abfrage (Abfrage, Abfrage, ändert den Systemstatus nicht) aus dem Unternehmen. Dies macht die Logik klarer und erleichtert die gezielte Optimierung verschiedener Teile.
CQRS hat die folgenden Punkte:
1. Die Arbeitsteilung ist klar und Sie können für verschiedene Teile verantwortlich sein.
2. Die Trennung der Verantwortlichkeiten von Geschäftsbefehlen und Abfragen kann die Leistung, Skalierbarkeit und Sicherheit des Systems verbessern. Darüber hinaus kann es ein hohes Maß an Flexibilität bei der Entwicklung des Systems aufrechterhalten und das Auftreten von Änderungen einer Partei in der Abfrage oder Änderung im CRUD -Modus verhindern, was zu Problemen mit der anderen Partei führt.
3.. Logik klare und kann sehen, dass diese Verhaltensweisen oder Operationen im System Änderungen im System des Systems verursacht haben;
V.
Daher verwendet der Befehl Datenbanken, und die Abfrage verwendet Elasticsearch mit effizienterer Abfrage.
Wie kann ich Konsistenz zwischen Datenbank- und Elasticsearch -Daten sicherstellen?
Wir können ereignisgesteuert, dh die Domänenereignis-Synchronisierungsdaten von Spring Data verwenden. Weitere Informationen finden Sie im Artikel: http://www.vevb.com/article/135604.htm.
Wenn eine alte Datenbank über eine große Menge an Daten verfügt, die in Elasticsearch importiert werden müssen
Spring Data Elasticsearch verwendet den Transport Client, während die offizielle Website von Elasticsearch empfiehlt, REST -Client zu verwenden. Es gibt immer noch Probleme mit dem Elasticsearch von Alibaba Cloud mit dem Transport -Client, und Alibaba Cloud empfiehlt die Verwendung von REST -Client.
In diesem Beispiel wird Elasticsearch -Link für Spring Data -Scherze verwendet (derzeit unterstützt nur Spring Boot2.0 oder höher). Die Version von Elasticsearch ist: 5.5.3
1. Projektbau
1.POM -Abhängigkeiten sind wie folgt:
<dependency> <groupId>com.github.vanroy</groupId> <artifactId>spring-boot-starter-data-jest</artifactId> <version>3.0.0.RELEASE</version></dependency><dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>5.3.2</version></dependency>
2. Konfigurationsdatei
Frühling: Daten: Scherz: URI: http://127.0.0.1:9200 Benutzername: Elastic Passwort: Changeme
2. Konstrukt -Abfragebedingungen konstruieren
Nehmen Sie als Beispiel eine einfache Entitätsklasse ein
Paket com.hfcsbc.esetl.domain; import lombok.data; import org.springframework.data.Elasticsearch.Annotations.Document; javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.OneToOne;import java.util.Date;import java.util.List;/** * Create by pengchao on 2018/2/23 */@Document(indexName = "person", type = "person", shards = 1, replicas = 0, refreshInterval = "-1")@Entity@Datapublic Class Person {@id private long id; privater Zeichenfolge Name; @Onetoone @field (type = fieldType.nested) Private List <Ade> Adresse; private Ganzzahlnummer; privater Ganzzahlstatus; Privatdatum Geburtstag;} package com.hfcsbc.esetl.domain;import lombok.Data;import javax.persistence.Entity;import javax.persistence.Id;/** * Create by pengchao on 2018/2/23 */@Entity@Datapublic class Address { @Id private Long id; privater Zeichenfolge Name; private Ganzzahlnummer;} 1. Abfrage basierend auf mehreren Zuständen (ähnlich wie bei SQLs in)
Boolquiller ordsterStatuscondition = querybuilders.boolQuery () .Should (querybuilders.terMQuery ("Status", 1). .should (querybuilders.terMQuery ("Status", 5)); 2. und Link -Abfrage (ähnlich wie SQL und)
BoolqueryBuilder queryBuilder = querybuilders.boolQuery (); queryBuilder .must (queryBuilder1) .must (queryBuilder2) .must (queryBuilder3);
3.Range Abfrage (ähnlich wie SQL zwischen .. und ..)
Die Codekopie lautet wie folgt:
QueryBuilder ravequery = querybuilders.RangeQuery ("Geburtstag"). Von (gestern) .to (heute);
4.. Verschachtelte Objektabfrage
Die Codekopie lautet wie folgt:
QueryBuilder queryBuilder = querybuilders.nestedQuery ("verschachtelt", querybuilders.termQuery ("adressierte.id", 100001), scoremode.none);
SCOREMODE: Definiert, wie Score in einer anderen Join -Seite verwendet wird. Wenn Sie nicht auf die Wertung achten, müssen wir es nur auf Scoremode.none einstellen. Diese Methode ignoriert die Punktzahl und ist daher effizienter und speichert Speicher
3.. Statistik erhalten
1. Uncted Data Summe
SumaggregationBuilder sumbuilder = aggregationBuilders.sum ("sum"). Field ("number"); SearchQuery SearchQuery = Neue NativeSearchQueryBuilder (). AggregierterPage <parkorder> Account = (aggregatedPage <Parkorder>) EssparkingorderRepository.Search (Esquerybuilders.BuildyesterDayarrearsumQuery (EmployeeId)); int sum = conto.getaggregation ("sum", sumaggregation.class) .getsum (). 2. verschachtelte Datensumme
Sumaggregationbuilder sumbuilder = aggregationbuilders.sum ("sum"). Field ("adress.num"); AggregationBuilder AggregationBuilder = AggregationBuilders.Nested ("verschachtelt", "Adress"). .withtypes (query_type) .withQuery (boolQueryBuilder) .Adaggregation ((AbstractAggregationBuilder) AggregationBuilder) .build (); aggregatterPage <parkorder> Account = (aggregierte Seite <parkorders>)) EssparkingorderRepository.Search (Esquerybuilders.buildyesterdayarrearsumQuery (EmployeeId)); int sum = Account.getAggregation ("verschachtelt",Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.