Вижте Spring Data Redis - 8.5. Вторични индекси и:
- 8.6. Запитване по пример
- 8.10. Заявки и методи за заявки
Анотацията @Indexed
инструктира Spring Data Redis (SDR) да създаде вторичен индексиран като набор за индексиране на полето на хеша.
Това означава, че когато вмъкнете данни, SDR ще изпълни седем команди към 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"
Използване на заявка по пример:
Искате да създадете хранилище:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
След това реализирайте заявката, както в примерната услуга по-долу:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
И използвайте като:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Зад кулисите, SDR ще се погрижи да преобразува това в Redis команди, за да получите вашите данни, като използва комбинация от SINTER и HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Това е процес в две стъпки:
- Извличане на ключове, съдържащи се в пресечната точка на вторичните индекси, с помощта на
SINTER
- Извличане на всеки ключ, върнат от <1> поотделно, като използвате
HGETALL
Работно натоварване от 100 000 в минута трябва да бъде управляемо за Redis, ако приемем, че имате качествен сървър, разумен размер на набора от данни и средно запитванията са малко специфични.
SINTER
има времева сложност от O(N*M) в най-лошия случай, където N е мощността на най-малкия набор, а M е броят на наборите. Имате един набор за всяко измерение на вашата заявка.
HGETALL
е O(N), където N е размерът на хеша, 7 във вашия случай.
Както винаги, препоръчва се да направите сравнителен анализ, за да тествате дали получавате желаната производителност и да коригирате, ако е необходимо.