명령 쿼리 책임 분리 (CQRS)는 수정 (명령, 추가, 삭제, 수정, 시스템 상태 수정)의 동작을 분리하고 쿼리 (쿼리, 쿼리, 시스템 상태를 비즈니스 상태로 수정하지 않음). 이것은 논리를 더 명확하게 만들고 다른 부분의 목표 최적화를 용이하게합니다.
CQRS에는 다음과 같은 점이 있습니다.
1. 노동 분업은 분명하며 여러분은 다른 부분에 대한 책임을 질 수 있습니다.
2. 비즈니스 명령 및 쿼리의 책임을 분리하면 시스템의 성능, 확장 성 및 보안이 향상 될 수 있습니다. 또한 시스템의 진화에서 높은 수준의 유연성을 유지하고 CRUD 모드에서 쿼리 또는 수정에서 한 당사자의 변화가 발생하지 않아 다른 당사자와의 문제를 초래할 수 있습니다.
3. 명확한 논리와 시스템의 동작이나 운영이 시스템 상태에 변화를 일으킨다는 것을 알 수 있습니다.
4. 데이터 중심에서 작업 중심 및 이벤트 중심으로 이동할 수 있습니다.
따라서 명령은 데이터베이스를 사용하고 쿼리는보다 효율적인 쿼리와 함께 Elasticsearch를 사용합니다.
데이터베이스와 Elasticsearch 데이터 간의 일관성을 보장하는 방법은 무엇입니까?
이벤트 중심, 즉 Spring Data의 도메인 이벤트 동기화 데이터를 사용할 수 있습니다. http://www.vevb.com/article/135604.htm을 참조하십시오.
이전 데이터베이스에 Elasticsearch로 가져와야하는 많은 양의 데이터가 있으면 기사를 참조하십시오 : http://www.vevb.com/article/135426.htm
Spring Data Elasticsearch는 Transport Client를 사용하는 반면 Elasticsearch의 공식 웹 사이트는 REST 클라이언트를 사용하는 것이 좋습니다. 운송 클라이언트를 사용한 Alibaba Cloud의 Elasticsearch에는 여전히 문제가 있으며 Alibaba Cloud는 REST 클라이언트를 사용하는 것이 좋습니다.
이 예제는 Spring Data Jest Link ElasticSearch를 사용합니다 (현재 Spring Boot2.0 이상을 지원합니다). Elasticsearch의 버전은 5.5.3입니다
1. 프로젝트 구성
1. POM 종속성은 다음과 같습니다.
<pectionency> <groupid> com.github.vanroy </groupid> <artifactid> Spring-Boot-Starter-Data-Jest </artifactid> <bersion> 3.0.0.Release> </dependency> <pectionency> <groupId> io.searchbox </groupId> <artifactid> </artifactid> </version> </version>
2. 구성 파일
봄 : 데이터 : Jest : URI : http://127.0.0.1:9200 사용자 이름 : 탄성 암호 : changeme
2. 쿼리 조건을 구성하십시오
간단한 엔티티 클래스를 예로 들어 보겠습니다
패키지 com.hfcsbc.esetl.domain; import lombok.data; import org.springframework.data.elasticsearch.annotations.document; import org.springframework.data.elasticsearch.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;/** * Pengchao에 의해 생성 (indexname = 0)에서 pengchao에 의해 생성됩니다. "-1")@entity@datapublic 클래스 사람 {@id private long id; 개인 문자열 이름; @onetoone @field (type = fieldtype.nested) 비공개 목록 <Schander> 주소; 개인 정수 번호; 개인 정수 상태; 개인 데이트 생일;} package com.hfcsbc.esetl.domain; import lombok.data; import javax.persistence.entity; import javax.persistence.id;/** * pengchao by 2018/2/23 */@entity@datapublic 클래스 주소 {@id private long id; 개인 문자열 이름; 개인 정수 번호;} 1. 여러 상태를 기반으로 한 쿼리 (SQL IN과 유사)
Boolquiller OrderstatusCondition = QueryBuilders.boolquery () .Should (QueryBuilders.ermquery ( "status", 1)) .Should (QueryBuilders.termquery ( "status", 2)) .should (QueryBuilders.termquery ( "status", 3)). .Should (QueryBuilders.ermquery ( "status", 5));
2. 및 링크 쿼리 (SQL과 유사)
boolqueryBuilder QueryBuilder = QueryBuilders.boolquery (); QueryBuilder .must (QueryBuilder1) .must (QueryBuilder2) .must (QueryBuilder3);
3. 쿼리 정리 (SQL과 유사합니다.
코드 사본은 다음과 같습니다.
QueryBuilder RangeQuery = QueryBuilders.rangeQuery ( "생일").부터 (어제) .to (오늘);
4. 중첩 된 객체 쿼리
코드 사본은 다음과 같습니다.
QueryBuilder QueryBuilder = QueryBuilders.nestedQuery ( "Nested", QueryBuilders.ermquery ( "jand
SCOREMODE : 다른 결합 측에서 점수가 사용되는 방식을 정의합니다. 득점에주의를 기울이지 않으면 스코어 모드로 설정하면됩니다. 이 방법은 점수를 무시하므로 더 효율적이며 메모리를 저장합니다.
3. 통계를 얻으십시오
1. 불분명 한 데이터 합계
sumaggationBuilder SumBuilder = AggregationBuilders.sum ( "sum"). field ( "number"); searchQuery searchQuery = new NativeSearchQueryBuilder () .withIndices (query_index) .withtypes (query_type) .withquery (booperyBuilder) AggregatedPage <ParkingOrder> Acc
2. 중첩 된 데이터 합계
sumaggationBuilder sumbuilder = AgregationBuilders.sum ( "sum"). field ( "adress.num"); AggregationBuilder AggregationBuilder = AgregationBuilder.nested ( "Nested", Subless "; SearchBuery = New Nec -BuyLder (). .withIndices (query_index) .withTypes (query_type) .withQuery (boolqueryBuilder) .addaggregation ((AbstractAggregationBuilder) AggregationBuilder). EsparkingOrderRepository.search (esqueryBuilders.buildyesterdayArrearsSumquery (EmployeeId)); int sum = ac
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.