Lihat Spring Data Redis - 8.5. Indeks Sekunder dan:
- 8.6. Kueri dengan Contoh
- 8.10. Kueri dan Metode Kueri
Anotasi @Indexed
menginstruksikan Spring Data Redis (SDR) untuk membuat indeks sekunder sebagai kumpulan untuk mengindeks bidang hash.
Artinya ketika Anda memasukkan data, SDR akan menjalankan tujuh perintah ke 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"
Menggunakan Kueri dengan Contoh:
Anda ingin membuat repositori:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
Dan kemudian implementasikan kueri seperti pada contoh layanan di bawah ini:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
Dan gunakan sebagai:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Di balik layar, SDR akan menangani konversi ini ke perintah Redis untuk mendapatkan data Anda, menggunakan kombinasi SINTER dan HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Ini adalah proses dua langkah:
- Ambil kunci yang terdapat di persimpangan indeks sekunder, menggunakan
SINTER
- Ambil setiap kunci yang dikembalikan oleh <1> satu per satu, menggunakan
HGETALL
Beban kerja 100.000 per menit harus dapat dikelola untuk Redis dengan asumsi Anda memiliki server yang berkualitas, ukuran kumpulan data yang masuk akal, dan rata-rata kuerinya agak spesifik.
SINTER
memiliki kompleksitas waktu O(N*M) kasus terburuk di mana N adalah kardinalitas dari himpunan terkecil dan M adalah jumlah himpunan. Anda memiliki satu set untuk setiap dimensi pada kueri Anda.
HGETALL
adalah O(N) di mana N adalah ukuran hash, 7 dalam kasus Anda.
Seperti biasa, Anda disarankan untuk melakukan beberapa pembandingan untuk menguji apakah Anda mendapatkan kinerja yang diinginkan dan menyesuaikan jika diperlukan.