Zobacz Spring Data Redis - 8.5. Indeksy dodatkowe i:
- 8.6. Zapytanie według przykładu
- 8.10. Zapytania i metody zapytań
Adnotacja @Indexed
instruuje Spring Data Redis (SDR), aby utworzyć dodatkowy indeksowany jako zestaw do indeksowania pola skrótu.
Oznacza to, że po wstawieniu danych SDR uruchomi siedem poleceń w 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"
Korzystanie z zapytania według przykładu:
Chcesz utworzyć repozytorium:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
A następnie zaimplementuj zapytanie jak w przykładowej usłudze poniżej:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
I użyj jako:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Za kulisami SDR zajmie się przekonwertowaniem tego na polecenia Redis, aby uzyskać dane, używając kombinacji SINTER i HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Jest to proces dwuetapowy:
- Pobierz klucze zawarte w przecięciu indeksów wtórnych za pomocą
SINTER
- Pobierz każdy klucz zwrócony przez <1> indywidualnie, używając
HGETALL
Obciążenie 100 000 na minutę powinno być możliwe do zarządzania dla Redis, zakładając, że masz serwer wysokiej jakości, rozsądny rozmiar zestawu danych, a zapytania są średnio dość specyficzne.
SINTER
ma złożoność czasową najgorszego przypadku O(N*M), gdzie N jest licznością najmniejszego zbioru, a M jest liczbą zbiorów. Masz jeden zestaw dla każdego wymiaru w zapytaniu.
HGETALL
to O(N), gdzie N jest rozmiarem skrótu, w twoim przypadku 7.
Jak zawsze, zaleca się wykonanie testów porównawczych, aby sprawdzić, czy uzyskujesz pożądaną wydajność i w razie potrzeby dostosować.