Perintah Kueri Segregasi Tanggung Jawab (CQRS) Memisahkan perilaku memodifikasi (perintah, menambah, menghapus, memodifikasi, memodifikasi status sistem) dan kueri (kueri, kueri, tidak akan memodifikasi status sistem) dari bisnis. Ini membuat logika lebih jelas dan memfasilitasi optimalisasi yang ditargetkan dari berbagai bagian.
CQRS memiliki poin berikut:
1. Pembagian kerja jelas dan Anda dapat bertanggung jawab atas bagian yang berbeda;
2. Memisahkan tanggung jawab perintah dan kueri bisnis dapat meningkatkan kinerja, skalabilitas, dan keamanan sistem. Selain itu, dapat mempertahankan tingkat fleksibilitas yang tinggi dalam evolusi sistem, dan mencegah terjadinya perubahan dalam satu pihak dalam kueri atau modifikasi dalam mode CRUD, yang mengakibatkan masalah dengan pihak lain;
3. Logika yang jelas dan dapat melihat bahwa perilaku atau operasi dalam sistem telah menyebabkan perubahan dalam keadaan sistem;
4. Anda dapat beralih dari data-driven ke tugas-digerakkan dan digerakkan oleh peristiwa.
Oleh karena itu, perintah menggunakan database, dan kueri menggunakan Elasticsearch dengan kueri yang lebih efisien.
Bagaimana cara memastikan konsistensi antara data database dan elasticsearch?
Kita dapat menggunakan data yang berbasis peristiwa, yaitu, data sinkronisasi acara domain Spring Data, silakan merujuk ke artikel: http://www.vevb.com/article/135604.htm.
Ketika database lama memiliki sejumlah besar data yang perlu diimpor ke Elasticsearch, Anda dapat merujuk pada artikel: http://www.vevb.com/article/135426.htm
Spring Data Elasticsearch menggunakan Transport Client, sementara situs web resmi Elasticsearch merekomendasikan penggunaan klien REST. Masih ada masalah dengan Elasticsearch Alibaba Cloud menggunakan Transport Client, dan Alibaba Cloud merekomendasikan menggunakan Klien REST.
Contoh ini menggunakan Spring Data Jest Link Elasticsearch (saat ini hanya mendukung Spring Boot2.0 atau di atas). Versi Elasticsearch adalah: 5.5.3
1. Konstruksi Proyek
1. Ketergantungan POM adalah sebagai berikut:
<dependency> <GroupId> com.github.vanroy </groupid> <ArTifactId> Spring-boot-starter-data-jest </artifactid> <version> 3.0.0.release </version> </Dependency> <groupid> IO.
2. File Konfigurasi
Spring: Data: Jest: URI: http://127.0.0.1:9200 Nama Pengguna: Kata Sandi Elastis: Changeme
2. Konstruksi Kondisi Kueri
Ambil kelas entitas sederhana sebagai contoh
Paket com.hfcsbc.esetl.domain; import lombok.data; impor org.springframework.data.elasticsearch.annotations.document; impor org.springframework.data.elasticsearch.annotations.field; org.springframework.data.elasticsearch.annotations.field; org.springframework.data.elasticsearch.annotations javax.persistence.entity; import javax.persistence.id; impor javax.persistence.onetoone; impor java.util.date; import java.util.list;/** * Buat dengan pengkhaan = "," ",", "Tipe =", "Tipe =", "Tipe =", "Tipe =", "Tipe =", "Tipe =", "Tipe =", "Tipe =", "Tipe =", "Tipe =" Tipe = "," "-1")@entitas@datapublic class person {@id id private long; nama string pribadi; @Onetoone @field (type = fieldType.nested) Daftar pribadi <spulht> Alamat; nomor bilangan bulat pribadi; status bilangan bulat pribadi; ulang tahun kencan pribadi;} Paket com.hfcsbc.esetl.domain; import lombok.data; import javax.persistence.entity; import javax.persistence.id;/** * Buat dengan Pengchao pada 2018/2/23 */@entity@data kelas DataPublic {@id Private ID Long;; nama string pribadi; nomor bilangan bulat pribadi;} 1. Kueri Berdasarkan banyak negara (mirip dengan SQL di)
Boolquiller orderstatuscondition = querybuilders.boolQuery () .should (querybuilders.termQuery ("status", 1)) .should (querybuilders.termQuery ("status", 2) .should (querybuilders.termQuery ("status", 3)) .should (querybuilders.termQuery ("Status", 3)) .should (querybuilders.termuery ("Status", 3)) .should (querybuilders.termuily ("", 3)) .should (querybuilders.terter .should (querybuilders.termQuery ("status", 5)); 2. dan tautan kueri (mirip dengan SQL dan)
Boolquerybuilder querybuilder = querybuilders.boolquery (); querybuilder .must (querybuilder1) .must (querybuilder2) .must (querybuilder3);
3.Range Query (mirip dengan SQL antara .. dan ..)
Salinan kode adalah sebagai berikut:
Querybuilder rangeQuery = querybuilders.rangeQuery ("ulang tahun"). Dari (kemarin) .to (hari ini);
4. Permintaan objek bersarang
Salinan kode adalah sebagai berikut:
Querybuilder querybuilder = querybuilders.nestedQuery ("bersarang", querybuilders.termQuery ("address.id", 100001), scoremode.none);
Scoremode: Menentukan bagaimana skor digunakan di sisi gabungan lainnya. Jika Anda tidak memperhatikan penilaian, kami hanya perlu mengaturnya ke ScoreMode.None. Metode ini akan mengabaikan skor dan karenanya akan lebih efisien dan menyimpan memori
3. Dapatkan statistik
1. Jumlah data yang tidak dikenakan
SumaggregationBuilder sumbuilder = agregationBuilders.sum ("sum"). Field ("number"); SearchQuery SearchQuery = NEW NATIONSECHQUERYBUILDER () .withindices (Query_index) .withTypes (query_type) .withquery (boolQuerybuilder) .adduildation (query_type) .withquery (boolQuerybuilder) .addArdArging). AgregatedPage <ParkingerTerD> Account = (AgregatedPage <ParkingOrder>) EsparkingOrderRepository.Search (EsqueryBuilders.BuildyesterdayArrearssumQuery (karyawan)); int sum = Account.getaggregation ("sum", sumaggregation.class) .getsum (). 2. Jumlah data bersarang
SumagregationBuilder sumbuilder = agregationBuilders.sum ("sum"). Field ("adress.num"); agregationBuilder agregationBuilder = agregationBuilders.nested ("Nested", "Adress"). Subagregasi (Sumbuilder); SearchQuery SearchQuery = Nativery (sumbuilder); pencarian natiery (sumbuilder) (sumbuerder) (sumbuerder); nativegregation (sumbuilder); Searchquery (sumbuerder); .withindices (query_index) .withTypes (query_type) .withquery (boolquerybuilder) .addaggregation ((AbstractaggregationBuilder) AgregationBuilder) .build (); agregatedpage <parkingorder> akun = (agregatedpage <parkingorder>)) EsparkingOrderRepository.Search (EsqueryBuilders.BuildyesterdayArrearSsumQuery (karyawan)); int sum = Account.getaggregation ("bersarang", sumagregation.class) .getaggregation ("sum", sumagregation.class) .getsum ().Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.